DateTime.Now.ToString(),往往存在有一些隐患

本文探讨了在C#中使用DateTime.Now.ToString()可能带来的跨地区时间显示不一致的问题,强调了通过指定统一的格式字符串来确保时间显示一致性的重要性,以避免潜在的程序错误。
C#中DateTime.Now.ToString(),往往存在有一些隐患:时间的表现形式是与当前系统的文化区域相关联的。如果你的操作系统的区域设置是中国,对于DateTime的ToString()方法,它等同于DateTime.Now.ToString("G", new CultureInfo("zh-CN")),显示为2009-4-16 18:20:31,而若你的区域设置是美国,那么将在程序中显示4/16/2009 6:03:11 PM,这样,在代码中使用DateTime.Now.ToString(),如果程序一旦迁移到其它国家的机器上,程序中显示和应用中的时间字符串不一致,这会导致一些比较难排查的异常。所以,在程序中我们需要保证时间显示的一致性,尽量不要采用DateTime.Now.ToString()这种形式,而是采用类似于DateTime.Now.ToString("G", new CultureInfo("zh-CN"))的形式,为DateTime的表示进行强制约束,这样项目中会减少一些出错概率的。
private void ResultHandle() { Set_ProcessControl_Timer(0, false); SSS_Debug(21); mTotalRunTime = DateTime.Now.Ticks - mTotalRunTime; label_timeused_counter.Text = (mTotalRunTime / 10000000).ToString("N2") + LanguageHelper.LocRM.GetString("second"); string time = DateTime.Now.ToString();//获取当前系统时间 完整的日期和时间 stoptime = DateTime.Now; mNowStopRunTestTime = time; string tList = ""; string tList2 = "";//添加到TotalResult tList += "条码,检验工作台编号,通过检验,是否维修,起始时间,终止时间,NG信息,NG细节"; tList2 += "条码,检验工作台编号,通过检验,是否维修,起始时间,终止时间,NG信息,NG细节,MAC地址"; string tDataList = ""; string tDataList2 = ""; //int tmpCnt = 0; string res = null; string res_index = string.Empty; try { for (int i = 0; i < dt_Group.Columns.Count; i++) { if (dt_Group.Rows[0][i].ToString() != "OK") { res += dt_Group.Columns[i].ColumnName + ":" + dt_Group.Rows[0][i].ToString() + "\r\n"; res_index += i.ToString() + ","; mNgDatas += dt_Group.Columns[i].ColumnName + ","; mNowIsPassedFlag = "NG"; } } if (mNgDatas != null && mNgDatas != "") mNgDatas = mNgDatas.TrimEnd(','); if (res_index != null && res_index != "") res_index = res_index.TrimEnd(','); if (passTheTest) { mNowIsPassedFlag = "人工中断"; } tDataList += "'" + mNowBarcodeValue + "',"; //条码 tDataList += "'" + mainform.mWorkGroupID + "',";//group tDataList += "'" + mNowIsPassedFlag + "',";//通过? tDataList += "'" + mNeedRepaired + "',";//维修? tDataList += "'" + mNowStartRunTestTime + "',";//起始测试时间 tDataList += "'" + mNowStopRunTestTime + "',";//终止测试时间 tDataList += "'" + mNgDatas + "',";//ng信息 tDataList += "'" + mNgDetail + "'";//ng细节 tDataList2 += "'" + mNowBarcodeValue + "',"; //条码 tDat
04-03
我项目中有一个通用的上传、下载、删除文件的方法,FileAppService,代码如下: using FileStorage.FileManagement.Dto; using Microsoft.VisualBasic.FileIO; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.IO.Pipes; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.BlobStoring; using Volo.Abp.Domain.Repositories; using static OnMonitor.OnMonitorApplicationModule; using static System.Net.WebRequestMethods; namespace OnMonitor.FlieManagement { // 应用服务实现 public class FileAppService : ApplicationService, IFileAppService { // 注入自定义容器(头像和文档) private readonly IBlobContainer<FlieContainer> _flieContainer; private readonly IBlobContainer<DocumentContainer> _documentContainer; private readonly IRepository<AbpFileInfo, Guid> _repository; private readonly IBlobContainer<DrawingDataContainer> _drawingDataContainer; private readonly IBlobContainer<DrawingCADContainer> _drawingCADContainer; private readonly IBlobContainer<DrawingPDFContainer> _drawingPDFContainer; public FileAppService( IBlobContainer<FlieContainer> flieContainer, IBlobContainer<DocumentContainer> documentContainer, IRepository<AbpFileInfo, Guid> repository, IBlobContainer<DrawingDataContainer> drawingDataContainer, IBlobContainer<DrawingCADContainer> drawingCADContainer, IBlobContainer<DrawingPDFContainer> drawingPDFContainer ) { _flieContainer = flieContainer; _documentContainer = documentContainer; _repository = repository; _drawingDataContainer = drawingDataContainer; _drawingCADContainer = drawingCADContainer; _drawingPDFContainer = drawingPDFContainer; } /// <summary> /// 上传文档(存储到DocumentContainer) /// </summary> public async Task<FileInfoDto> UploadFlieAsync(byte[] byteFile, string name, string? containerName="") { if (containerName == null) { containerName = "file"; } // 根据容器名获取对应的容器实例 var container = GetContainerByContainerName(containerName); var fileExtension = Path.GetExtension(name); var size = byteFile.Length.ToString(); string uploadsFolder = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Files"); if (!Directory.Exists(uploadsFolder)) { Directory.CreateDirectory(uploadsFolder); } var uniqueFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + name; string filePath = Path.Combine(uploadsFolder, uniqueFileName); // 上传文件流到容器 using (var stream = new MemoryStream(byteFile)) { await container.SaveAsync(uniqueFileName, stream, overrideExisting: true); } AbpFileInfo fileInfo = new AbpFileInfo() { Name = name, RealName = uniqueFileName, Suffix = fileExtension, Size = size, Path = filePath, BlobName = uniqueFileName, ContainerName = containerName, FlieType = "File" }; //TODO:文件md5哈希校验 var result = await _repository.InsertAsync(fileInfo); return ObjectMapper.Map<AbpFileInfo, FileInfoDto>(result); } /// <summary> /// 下载文件 /// </summary> public async Task<FileDto> DownloadAsync(string blobName, string? containerName = "") { // 根据容器名获取对应的容器实例 var container = GetContainerByContainerName(containerName); // 检查文件是否存在 if (!await container.ExistsAsync(blobName)) { throw new UserFriendlyException("文件不存在"); } // 读取文件流 using (var stream = await container.GetAsync(blobName)) { using (var memoryStream = new MemoryStream()) { await stream.CopyToAsync(memoryStream); return new FileDto { Content = memoryStream.ToArray(), FileName = blobName // 可替换为原文件名 }; } } } /// <summary> /// 删除文件 /// </summary> public async Task DeleteAsync(string blobName, string? containerName = "") { var container = GetContainerByContainerName(containerName); await container.DeleteAsync(blobName); } public async Task<List<FileInfoDto>> GetAllAsync(string? containerName = "") { if (containerName == null) { containerName = "file"; } var data= await _repository.GetListAsync(); var result=data.Where(u=>u.ContainerName.Contains(containerName)).ToList(); return ObjectMapper.Map<List<AbpFileInfo>,List<FileInfoDto>>(result); ; } /// <summary> /// 根据容器名获取容器实例(辅助方法) /// </summary> private IBlobContainer GetContainerByContainerName(string? containerName="") { if (containerName == "") { containerName = "file"; } return containerName switch { "file" => _flieContainer, "documents" => _documentContainer, "drawingData" => _drawingDataContainer, "drawingCAD" => _drawingCADContainer, "drawingPDF" => _drawingPDFContainer, _ => throw new UserFriendlyException("无效的容器名") }; } } }
最新发布
11-15
private void ProcessJobStart(int deviceId) { var state = deviceStates[deviceId]; // 关键修改2:检查RFID和LOT是否为空 if (string.IsNullOrEmpty(state.CurrentRFID) || string.IsNullOrEmpty(state.CurrentLot)) { Debug.WriteLine($"设备 {deviceId}: RFID或LOT为空,跳过处理"); return; } if (IsZeroRFID(state.CurrentRFID)) { Debug.WriteLine($"设备 {deviceId}: 检测到全零RFID '{state.CurrentRFID}',跳过处理"); state.PendingResponse = 0; // 无响应 state.ResponseSent = true; // 标记为已处理 return; } // 安全访问数据库 lock (dbLock) { try { if (mysql == null) { mysql = new MySql(constring); mysql.MysqlOpen(); } // 1. 解析LOT类型 string lotType = GetLotType(state.CurrentLot); string sizePrefix = state.CurrentLot.Substring(2, 2); // 2. 查询研磨球信息 string sql = $"SELECT * FROM tb_ballinfor WHERE 制品size = '{sizePrefix}' AND 区分 = '{lotType}'"; DataTable ballInfo = mysql.Returndt(sql); if (ballInfo.Rows.Count == 0) { state.PendingResponse = 3; // 不匹配 // 使用设备自己的PLC实例发送响应 SendResponseToPLC(deviceId, state.PendingResponse); return; } usenum = Convert.ToInt32(ballInfo.Rows[0][3]); ballsize = ballInfo.Rows[0][4].ToString(); innum = ballInfo.Rows[0][5].ToString(); // 3. 查询RFID状态 sql = $"SELECT * FROM tb_rfid_new WHERE RFID = '{state.CurrentRFID}' and loadtime is null"; DataTable rfidInfo = mysql.Returndt(sql); if (rfidInfo.Rows.Count == 0) { state.PendingResponse = 3; // 不匹配 SendResponseToPLC(deviceId, state.PendingResponse); return; } int useCount = Convert.ToInt32(rfidInfo.Rows[0][2]); string currentState = rfidInfo.Rows[0][3].ToString(); string rfidBallSize = rfidInfo.Rows[0][5].ToString(); string rfidInnum = rfidInfo.Rows[0][6].ToString(); // MessageBox.Show(useCount.ToString()+"/"+ currentState+ "/" + rfidBallSize + "/" + rfidInnum); // 4. 判断作业条件 if (useCount >= usenum) { state.PendingResponse = 2; // 到期 } else if (currentState != "待期") { state.PendingResponse = 4; // 使用中 } else if (rfidBallSize != ballsize || rfidInnum != innum) { state.PendingResponse = 3; // 不匹配 } else { state.PendingResponse = 1; // 允许 state.JobStartTime = DateTime.Now; // 更新数据库 sql = $@" UPDATE tb_rfid_new SET 作业次数 = 作业次数 + 1, 当前设备 = '{deviceId}', 当前状态 = '作业中' WHERE RFID = '{state.CurrentRFID}' and loadtime is null"; mysql.NonReturn(sql); sql = $@" INSERT INTO tb_mac(设备, 当前状态, 作业机种, RFID, 时间) VALUES({deviceId}, '绿灯', '{state.CurrentLot}', '{state.CurrentRFID}', NOW())"; mysql.NonReturn(sql); } // 5. 响应PLC //state.PlcInstance.SetDevice2("R510", (short)state.PendingResponse); SendResponseToPLC(deviceId, state.PendingResponse); } catch (Exception ex) { // 处理异常 Debug.WriteLine($"ProcessJobStart异常: {ex.Message}"); } } }
07-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值