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

本文探讨了在C#中使用DateTime.Now.ToString()可能带来的跨地区时间显示不一致的问题,强调了通过指定统一的格式字符串来确保时间显示一致性的重要性,以避免潜在的程序错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
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
package indi.backend.repository.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; import java.util.UUID; @Data @Builder @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "Users") public class Users { @Id @Column(columnDefinition = "uniqueidentifier") public UUID id; @Column(columnDefinition = "datetime2") public Date creationTime; @Column(columnDefinition = "nvarchar(max)") public String account; @Column(columnDefinition = "nvarchar(max)") public String password; @Column(columnDefinition = "bit") public Boolean enabled; @Column(columnDefinition = "datetime2") public Date lockStartTime; @Column(columnDefinition = "datetime2") public Date lockEndTime; @Column(columnDefinition = "nvarchar(max)") public String username; @Column(columnDefinition = "nvarchar(max)") public String avatar; @Column(columnDefinition = "nvarchar(max)") public String email; @Column(columnDefinition = "nvarchar(max)") public String phone; @Column(columnDefinition = "nvarchar(max)") public String sex; @Column(columnDefinition = "datetime2") public Date birthday; @Column(columnDefinition = "nvarchar(max)") public String address; @Column(columnDefinition = "datetime2") public Date lastActiveTime; @Column(columnDefinition = "int") public Integer permissionsLevel; @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private TokenPool tokenPool; } package indi.backend.repository.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; import java.util.UUID; @Data @Builder @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "TokenPool") public class TokenPool { @Id @Column(columnDefinition = "uniqueidentifier") public UUID id; @Column(columnDefinition = "datetime2") public Date creationTime; @Column(columnDefinition = "datetime2") public Date expiredTime; @Column(columnDefinition = "bit") public Boolean longTerm; @OneToOne @JoinColumn(name = "userId", nullable = false) private Users user; } 根据这两个实体优化public String login(String account, String password) { Users users = usersRepository.findByAccountAndPassword(account, cryptoUtil.sha256(password)).orElseThrow(() -> new RuntimeException("用户名或密码错误")); Date expiredTime = Date.from(LocalDateTime.now().plusSeconds(3600).atZone(ZoneId.systemDefault()).toInstant()); users.setLastActiveTime(expiredTime); usersRepository.save(users); TokenPool tokenPool = tokenPoolRepository.findByUserId(users.getId()).orElseGet(() -> TokenPool.builder().id(UUID.randomUUID()).creationTime(new Date()).longTerm(false).user(users).build()); tokenPool.setExpiredTime(expiredTime); tokenPoolRepository.save(tokenPool); return tokenPool.getId().toString(); } public void logout(String token) { if (token == null || token.isEmpty()) { throw new RuntimeException("没有传入token"); } TokenPool tokenPool = tokenPoolRepository.findById(UUID.fromString(token)).orElse(null); if (tokenPool != null) { usersRepository.findById(tokenPool.getUser().getId()).ifPresent(users -> { users.setLastActiveTime(new Date()); usersRepository.save(users); }); tokenPoolRepository.delete(tokenPool); } }不抽取方法
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值