日常的开发笔记----定期随手更新
C#开发:
TimestampHelper时间戳转换工具
using System;
using System.Collections.Generic;
using System.Text;
namespace IC.HT.Model.Lab.Json
{
/// <summary>
/// 日期类型转换工具
/// </summary>
public class TimestampHelper
{
/// <summary>
/// Unix时间戳转为C#格式时间
/// </summary>
/// <param name="timeStamp">Unix时间戳格式,例如:1482115779, 或long类型</param>
/// <returns>C#格式时间</returns>
public static DateTime GetDateTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
/// <summary>
/// 时间戳转为C#格式时间
/// </summary>
/// <param name="timeStamp">Unix时间戳格式</param>
/// <returns>C#格式时间</returns>
public static DateTime GetDateTime(long timeStamp)
{
DateTime time = new DateTime();
try
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
time = dtStart.Add(toNow);
}
catch
{
time = DateTime.Now.AddDays(-30);
}
return time;
}
/// <summary>
/// DateTime时间格式转换为Unix时间戳格式
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public static long ToLong(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (long)(time - startTime).TotalSeconds;
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
}
}
利用反射获取自定义标签,根据自定义标签判断计算
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Interface.Core.Models.RpnModel.FM
{
public class ItemModel
{
[EnitityMapping(ColumnName = "门店编码")]
public string Code { get; set; }
[EnitityMapping(ColumnName = "日期")]
public DateTime CurDate { get; set; }
[EnitityMapping(ColumnName = "店内")]
public int InStore { get; set; }
[EnitityMapping(ColumnName = "星**")]
public int MOD { get; set; }
[EnitityMapping(ColumnName = "o*")]
public int MOP { get; set; }
[EnitityMapping(ColumnName = "吧台小食", ColumuType = "Item")]
public int BarFood { get; set; }
[EnitityMapping(ColumnName = "**咖啡", ColumuType = "Item")]
public int BlackEagle { get; set; }
[EnitityMapping(ColumnName = "**饮料", ColumuType = "Item")]
public int Blended { get; set; }
[EnitityMapping(ColumnName = "**咖啡", ColumuType = "Item")]
public int BrewedMethod { get; set; }
[EnitityMapping(ColumnName = "茶", ColumuType = "Item")]
public int BrewedTea { get; set; }
[EnitityMapping(ColumnName = "**咖啡", ColumuType = "Item")]
public int Espresso { get; set; }
[EnitityMapping(ColumnName = "糕点", ColumuType = "Item")]
public int Food { get; set; }
[EnitityMapping(ColumnName = "零售商品", ColumuType = "Item")]
public int Merchandise { get; set; }
[EnitityMapping(ColumnName = "**特调", ColumuType = "Item")]
public int Mixology { get; set; }
[EnitityMapping(ColumnName = "加类", ColumuType = "Item")]
public int Modifier { get; set; }
[EnitityMapping(ColumnName = "其他零售商品", ColumuType = "Item")]
public int OtherRetail { get; set; }
[EnitityMapping(ColumnName = "包装食品", ColumuType = "Item")]
public int PackagedFood { get; set; }
[EnitityMapping(ColumnName = "其他饮料", ColumuType = "Item")]
public int RTD { get; set; }
[EnitityMapping(ColumnName = "加热食品", ColumuType = "Item")]
public int WarmFood { get; set; }
[EnitityMapping(ColumnName = "**咖啡豆", ColumuType = "Item")]
public int WholeBean { get; set; }
#region 参考字段
/// <summary>
/// ADT
/// </summary>
public int ADT => InStore + MOD + MOP;
/ <summary>
/ IPT 全天Item总和/全天adt
/ </summary>
//public double IPT => Math.Round((double)(BarFood + BlackEagle + Blended + BrewedMethod + BrewedTea + Espresso + Food + Merchandise + Mixology + Modifier + OtherRetail + PackagedFood + RTD + WarmFood + WholeBean) / (double)this.ADT, 8, MidpointRounding.AwayFromZero);
/// <summary>
/// IPT 全天Item总和/全天adt (别问我问什么不用上面的代码,因为闲)
/// </summary>
public double IPT
{
get
{
Type objType = this.GetType();
int itemTotal = 0;
foreach (PropertyInfo propInfo in objType.GetProperties())
{
object[] objAttrs = propInfo.GetCustomAttributes(typeof(EnitityMappingAttribute), true);
if (objAttrs.Length > 0)
{
EnitityMappingAttribute attr = objAttrs[0] as EnitityMappingAttribute;
if (attr != null && attr.ColumuType == "Item")
{
itemTotal += (int)propInfo.GetValue(this, null);
}
}
}
return Math.Round((double)(itemTotal) / (double)this.ADT, 8, MidpointRounding.AwayFromZero);
}
}
#endregion
}
/// <summary>
/// 自定义特性 属性或者类可用 支持继承
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, Inherited = true)]
public class EnitityMappingAttribute : Attribute
{
private string tableName;
/// <summary>
/// 实体实际对应的表名
/// </summary>
public string TableName
{
get { return tableName; }
set { tableName = value; }
}
private string columnName;
/// <summary>
/// 中文列名
/// </summary>
public string ColumnName
{
get { return columnName; }
set { columnName = value; }
}
private string columuType;
/// <summary>
/// 列类型
/// </summary>
public string ColumuType
{
get { return columuType; }
set { columuType = value; }
}
}
}
各类时间字符串转换:
if (string.IsNullOrEmpty(id)) throw new ArgumentNullException(nameof(id));
DateTime res;
if (DateTime.TryParseExact(id, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out res))
压缩文件
#region 压缩图片
try
{
//图片原路径
Mat mat = Cv2.ImRead(imgF.FullName, ImreadModes.Color);
//图片新路径
var newImg = imgF.FullName.Replace(".JPG", "_ed.JPG");
Cv2.ImWrite(newImg, mat, new ImageEncodingParam(ImwriteFlags.JpegQuality, 10));//100代表图片质量 范围是0-100 默认95
FileStream file = System.IO.File.Open(newImg, FileMode.Open); //打开修改好的图片
byte[] buffer = new byte[file.Length];//创建图片缓存
file.Read(buffer, 0, (int)file.Length);//将图片读入缓存
buffer[0x0D] = 1; //设置图片单位密度
//设置水平分辨率 0x258转10进制是 600
buffer[0x0E] = 0x2;
buffer[0x0F] = 0X58;
//设置垂直分辨率
buffer[0x10] = 0x2;
buffer[0x11] = 0x58;
//缓存重新指向图片
file.Seek(0, SeekOrigin.Begin);
//写入图片
file.Write(buffer, 0, (int)file.Length);
file.Close();
}
catch (Exception ex)
{
break;
}
#endregion
获取JPG 文件的详细信息
/// <summary>
/// 获取图片中的GPS坐标点
/// </summary>
/// <param name="p_图片路径">图片路径</param>
/// <param name="p_图片路径">0x0002:经纬度,0x006:拍摄高度</param>
/// <returns>返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值</returns>
public static String fnGPS经纬高(String p_图片路径, int id_下标)
{
String s_GPS经纬高 = "";
//载入图片
Image objImage = Image.FromFile(p_图片路径);
//取得所有的属性(以PropertyId做排序)
var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);
//暂定纬度N(北纬)
char chrGPSLatitudeRef = 'N';
//暂定经度为E(东经)
char chrGPSLongitudeRef = 'E';
foreach (PropertyItem objItem in propertyItems)
{
//只取Id范围为0x0000到0x001e
if (objItem.Id >= 0x0000 && objItem.Id <= 0x001e)
{
//对下标赋值
objItem.Id = id_下标;
switch (objItem.Id)
{
case 0x0000:
var query = from tmpb in objItem.Value select tmpb.ToString();
string sreVersion = string.Join(".", query.ToArray());
break;
case 0x0001:
chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);
break;
case 0x0002:
if (objItem.Value.Length == 24)
{
//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
//计算经纬度数值, 如果是南纬, 要乘上(-1)
double dblGPSLatitude = (((s / 60 + m) / 60) + d) * (chrGPSLatitudeRef.Equals('N') ? 1 : -1);
string strLatitude = string.Format("{0:#} deg {1:#}' {2:#.00}\" {3}", d
, m, s, chrGPSLatitudeRef);
//纬度+经度
s_GPS经纬高 += dblGPSLatitude + "+";
}
break;
case 0x0003:
//透过BitConverter, 将Value转成Char('E' / 'W')
//此值在后续的Longitude计算上会用到
chrGPSLongitudeRef = BitConverter.ToChar(objItem.Value, 0);
break;
case 0x0004:
if (objItem.Value.Length == 24)
{
//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)
double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)
double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)
double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
//计算精度的数值, 如果是西经, 要乘上(-1)
double dblGPSLongitude = (((s / 60 + m) / 60) + d) * (chrGPSLongitudeRef.Equals('E') ? 1 : -1);
}
break;
case 0x0005:
string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? "0" : "1";
break;
case 0x0006:
if (objItem.Value.Length == 8)
{
//将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint
double dblAltitude = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
//纬度+经度+拍摄高度
s_GPS经纬高 += dblAltitude.ToString();
}
break;
}
}
}
return s_GPS经纬高;
}
下载文件:
public class Web
{
public static bool Download(string url, string destDir, string destFileName)
{
if (destFileName == null)
destFileName = url.Split(Path.DirectorySeparatorChar).Last();
Directory.CreateDirectory(destDir);
string relativeFilePath = Path.Combine(destDir, destFileName);
if (File.Exists(relativeFilePath))
{
return false;
}
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, relativeFilePath);
return true;
}
}
public static bool Download(string url, string relativeFilePath)
{
if (File.Exists(relativeFilePath))
{
return false;
}
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, relativeFilePath);
return true;
}
}
/// <summary>
/// 删除非空文件夹
/// </summary>
/// <param name="path">要删除的文件夹目录</param>
void DeleteDirectory(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
DirectoryInfo[] childs = dir.GetDirectories();
foreach (DirectoryInfo child in childs)
{
child.Delete(true);
}
dir.Delete(true);
}
}
/// 3 递归方法:(这是删除文件的方法)
private staticv oid DeleteDirectory(File tmpFile) {
if (!tmpFile.exists()) {
System.out.println("file is not exist!");
return;
}
if (tmpFile.isDirectory()) {
File[] fileList = tmpFile.listFiles();
for (int i =0; i < fileList.length; i++) {
if (fileList[i].isDirectory()) {
DeleteDirectorys(fileList[i]);s
}
}
}
}
}
获取工作区链路径
-
string str1 =Process.GetCurrentProcess().MainModule.FileName; //可获得当前执行的exe的文件名。
-
string str2=Environment.CurrentDirectory; //获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
-
//备注 按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:/”)。
-
如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如“C:/mySubDirectory”)。
-
string str3=Directory.GetCurrentDirectory(); //获取应用程序的当前工作目录。 ---------常用-----
-
string str4=AppDomain.CurrentDomain.BaseDirectory; //获取基目录,它由程序集冲突解决程序用来探测程序集。
-
string str5=Application.StartupPath;
-
//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。(如:D:/project/集团客户短信服务端/bin/Debug)
-
string str6=Application.ExecutablePath; //获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
-
string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase; //获取或设置包含该应用程序的目录的名称。
获取分组后的第一条数据
var onlyCarList = saigeCar.GroupBy(gg => gg.CarNo).Select(groups => new { FirstOrDefault = groups.FirstOrDefault() });
获取JSON文件
/// <summary>
/// 读取JSON文件
/// </summary>
/// <param name="key">JSON文件中的key值</param>
/// <returns>JSON文件中的value值</returns>
public static string Readjson(string key, string jsonUrl)
{
string jsonfile = $@"D:\A_WeaversysHard\IntelligentCommunity\IC.HT\IC.HT.Web\wwwroot\json\{jsonUrl}.json";//JSON文件路径
using (System.IO.StreamReader file = System.IO.File.OpenText(jsonfile))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject o = (JObject)JToken.ReadFrom(reader);
var value = o[key].ToString();
return value;
}
}
}
new list(无下标)
string[] props = { "committeeId", "organName", "OrganId", "FaceType" };
获取时间
//获取当前月份的第一天
var sDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
//获取当前月份的最后一天最后59秒
var eDate = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date.AddMonths(1).AddSeconds(-1); ;
automapper多类映射规则:
return new MapperConfiguration(cfg =>
{
cfg.CreateMap<TIotSensingDevice, TIotSensingDeviceDto>();
cfg.CreateMap<TJingxunyunDataNumber, TJingxunyunDataNumberDto>();
cfg.CreateMap<TJingxunyunEquipmentDataType, TJingxunyunEquipmentDataTypeDto>();
cfg.CreateMap<TJinxunyunEquipment, TJinxunyunEquipmentDto>();
cfg.CreateMap<EquipDataNumber, EquipDataNumberDto>()
.ForMember(s => s.jingxunyunDataNumberDto, opt => { opt.MapFrom(s => s.jingxunyunDataNumber); })
.ForMember(s => s.iotSensingDeviceDto, opt => { opt.MapFrom(s => s.iotSensingDevice); })
.ForMember(s => s.jingxunyunEquipmentDataTypeDto, opt => { opt.MapFrom(s => s.jingxunyunEquipmentDataType); })
.ForMember(s => s.jinxunyunEquipmentDto, opt => { opt.MapFrom(s => s.jinxunyunEquipment); });
});
表达式JOIN
var list = _context.StPrepareEquip.Join(_context.StStoreHouse, s => s.StoreHouseId, sh => sh.StoreHouseId, (s, sh) => new StPrepareEquipDto
{
PrepareEquipId = s.PrepareEquipId,
StoreHouseId = s.StoreHouseId,
EquipType = s.EquipType,
EquipModel = s.EquipModel,
EquipSupplier = s.EquipSupplier,
SupplierId = s.SupplierId,
Quantity = s.Quantity,
BuyDate = s.BuyDate.Value,
OutRepairDate = s.OutRepairDate.Value.ToString("yyyy-MM-dd"),
ReportDate = s.ReportDate,
IsDeleted = s.IsDeleted,
Store = sh.Store,
OrganId = sh.OrganId
}).Where();
前台JS:
获取经纬度数组(多边形)的中心点:
function getCenter(pointArray) {
var sortedLongitudeArray = pointArray.map(item => item.lng).sort();//首先对经度进行排序,红色部分是array中经度的名称
var sortedLatitudeArray = pointArray.map(item => item.lat).sort();//对纬度进行排序,红色部分是array中纬度的名称
var centerLongitude = ((parseFloat(sortedLongitudeArray[0]) + parseFloat(sortedLongitudeArray[sortedLongitudeArray.length - 1])) / 2).toFixed(4);
const centerLatitude = ((parseFloat(sortedLatitudeArray[0]) + parseFloat(sortedLatitudeArray[sortedLatitudeArray.length - 1])) / 2).toFixed(4);
return [centerLongitude, centerLatitude];
}
获取经纬度(折线)的中心点
function calculateCenter(lnglatarr) {
var total = lnglatarr.length;
var X = 0, Y = 0, Z = 0;
$.each(lnglatarr, function (index, lnglat) {
var lng = lnglat.lng * Math.PI / 180;
var lat = lnglat.lat * Math.PI / 180;
var x, y, z;
x = Math.cos(lat) * Math.cos(lng);
y = Math.cos(lat) * Math.sin(lng);
z = Math.sin(lat);
X += x;
Y += y;
Z += z;
});
X = X / total;
Y = Y / total;
Z = Z / total;
var Lng = Math.atan2(Y, X);
var Hyp = Math.sqrt(X * X + Y * Y);
var Lat = Math.atan2(Z, Hyp);
return new AMap.LngLat(Lng * 180 / Math.PI, Lat * 180 / Math.PI);
};
将js中的数据保存为JSON格式。
具体实现如下:
var content = JSON.stringify(Interpretation);
var eleLink = document.createElement('a');
eleLink.download = "InterpretationLithology.json";
eleLink.style.display = 'none';
// 字符内容转变成blob地址
var blob = new Blob([content]);
eleLink.href = URL.createObjectURL(blob);
// 触发点击
document.body.appendChild(eleLink);
eleLink.click();
// 然后移除
document.body.removeChild(eleLink);
更好用的视频插件:
萤石云
获取时间:
(new Date()).Format('yyyy-MM-dd hh:mm:ss.S')
JS Format格式:
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
滑动轨道 :
body::-webkit-scrollbar, .CuringStrength::-webkit-scrollbar { /*滑轨优化JS*/
width: 8px; /*高å½åˆ†åˆ«å¯¹åº”横竖滚动æ¡çš„尺寸*/
height: 8px;
scrollbar-arrow-color: red;
}
body::-webkit-scrollbar-thumb, .CuringStrength::-webkit-scrollbar-thumb { /*滚动æ¡é‡Œé¢å°æ–¹å—*/
border-radius: 8px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.2);
scrollbar-arrow-color: red;
}
body::-webkit-scrollbar-track, .CuringStrength::-webkit-scrollbar-track { /*滚动æ¡é‡Œé¢è½¨é“*/
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
border-radius: 0;
background: rgba(0,0,0,0.1);
}
SQL SERVER
多列合并为一列(行转列):
Select STUFF((select ' '+ Value from [EPAUnit].[dbo].[Gg_02_DictionaryInfo] where IsDeleted =0 group by Value FOR XML PATH('')),1,1,'')
在清洗数据的时候,经常会遇到去重的需求,特地在这里记录一下。
查询重复的数据
select * , row_number() over (partition by 字段 order by 字段) as rowid from 表名
where 字段 in (select 字段 from 表名
group by 字段 having count(字段)>1)
查询MySQL 也适用
删除重复的数据,保留一条
delete t from (select * , row_number() over (partition by 字段 order by 字段) as rowid from 表名
where 字段 in (select 字段 from 表名
group by 字段 having count(字段)>1)) t where t.rowid != 1