C#图书馆预约系统:DateTime区分AM/PM及凌晨12点重置实现问询
问题
我是C#新手,对耦合技术了解有限,正在为学校图书馆开发预约系统,已实现仅需文件名和输入参数的Writer方法。有两个问题:
- 在if语句中使用什么语法区分AM与PM?
- 在另一个窗体中实现凌晨12点重置功能应采用什么语法?我担心程序未运行时重置无法执行。
注:标签红背景代表时间已过或已被预约
我的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Windows.Forms; namespace MMCM_Library { internal class TimerBuffer { ReadandWriteTxtfile Writer = new ReadandWriteTxtfile(); public void Resetat12am() //I'll call this in the main form { Writer.Write("DCR1_9am.txt", "0"); Writer.Write("DCR1_11am.txt", "0"); Writer.Write("DCR1_1pm.txt", "0"); Writer.Write("DCR1_3pm.txt", "0"); Writer.Write("DCR2_9am.txt", "0"); Writer.Write("DCR2_11am.txt", "0"); Writer.Write("DCR2_1pm.txt", "0"); Writer.Write("DCR2_3pm.txt", "0"); Writer.Write("DCR3_9am.txt", "0"); Writer.Write("DCR3_11am.txt", "0"); Writer.Write("DCR3_1pm.txt", "0"); Writer.Write("DCR3_3pm.txt", "0"); Writer.Write("DCR4_9am.txt", "0"); Writer.Write("DCR4_11am.txt", "0"); Writer.Write("DCR4_1pm.txt", "0"); Writer.Write("DCR4_3pm.txt", "0"); } public void TimePassed() //I'll call this in the loading of the main form and upon reservation { DateTime currentTime = DateTime.Now; if (currentTime.Hour >= 9) { Writer.Write("DCR1_9am.txt", "1"); Writer.Write("DCR2_9am.txt", "1"); Writer.Write("DCR3_9am.txt", "1"); Writer.Write("DCR4_9am.txt", "1"); } if (currentTime.Hour >= 11) { Writer.Write("DCR1_11am.txt", "1"); Writer.Write("DCR2_11am.txt", "1"); Writer.Write("DCR3_11am.txt", "1"); Writer.Write("DCR4_11am.txt", "1"); } if (currentTime.Hour >= 1) { Writer.Write("DCR1_1pm.txt", "1"); Writer.Write("DCR2_1pm.txt", "1"); Writer.Write("DCR3_1pm.txt", "1"); Writer.Write("DCR4_1pm.txt", "1"); } //more..... } } }
解答
一、区分AM/PM的语法
C#里可以通过两种方式快速区分上午(AM)和下午(PM):
通过
DateTime.Hour数值判断- AM对应
Hour范围:0-11(0点是凌晨12点,11点是上午11点) - PM对应
Hour范围:12-23(12点是中午12点,23点是晚上11点)
示例代码:
DateTime now = DateTime.Now; if (now.Hour < 12) { // 上午逻辑 } else { // 下午逻辑 }针对你代码里的
TimePassed方法,之前判断1pm的逻辑currentTime.Hour >=1会错误覆盖凌晨1点到8点的情况,应该修正为:// 正确判断是否过了下午1点(13点) if (currentTime.Hour >= 13) { Writer.Write("DCR1_1pm.txt", "1"); // ...其他房间的1pm文件写入逻辑 }- AM对应
通过格式化字符串获取AM/PM标识
直接将DateTime格式化为"tt",得到"AM"或"PM"字符串,适合需要精确匹配展示的场景:string period = DateTime.Now.ToString("tt"); if (period == "AM") { // 上午逻辑 } else { // 下午逻辑 }
二、凌晨12点重置功能的实现
程序运行时的定时重置方案
推荐使用WinForms自带的System.Windows.Forms.Timer,在窗体中初始化定时器,定时检查并触发重置:
private System.Windows.Forms.Timer resetTimer; public YourForm() { InitializeComponent(); SetupResetTimer(); } private void SetupResetTimer() { resetTimer = new System.Windows.Forms.Timer(); // 计算距离下一次凌晨12点的毫秒数 TimeSpan timeUntilMidnight = DateTime.Today.AddDays(1) - DateTime.Now; resetTimer.Interval = (int)timeUntilMidnight.TotalMilliseconds; resetTimer.Tick += ResetTimer_Tick; resetTimer.Start(); } private void ResetTimer_Tick(object sender, EventArgs e) { // 执行重置逻辑 TimerBuffer timerBuffer = new TimerBuffer(); timerBuffer.Resetat12am(); // 重新计算下一次凌晨12点的间隔,确保每天触发 TimeSpan timeUntilMidnight = DateTime.Today.AddDays(1) - DateTime.Now; resetTimer.Interval = (int)timeUntilMidnight.TotalMilliseconds; }
这个方案会在程序运行时持续工作,最小化或后台状态下也能正常触发重置。
程序未运行时的重置补救方案
如果程序关闭后无法执行重置,最可靠的方式是在程序启动时补做重置:
private void MainForm_Load(object sender, EventArgs e) { // 取任意一个预约文件作为参考,判断是否需要重置 string sampleFile = "DCR1_9am.txt"; if (File.Exists(sampleFile)) { DateTime lastWriteDate = File.GetLastWriteTime(sampleFile).Date; if (lastWriteDate != DateTime.Today) { // 上次修改日期不是今天,执行重置 TimerBuffer timerBuffer = new TimerBuffer(); timerBuffer.Resetat12am(); } } else { // 文件不存在时初始化预约状态 TimerBuffer timerBuffer = new TimerBuffer(); timerBuffer.Resetat12am(); } // 执行时间过期检查逻辑 TimerBuffer tb = new TimerBuffer(); tb.TimePassed(); }
不管程序什么时候启动,都会确保当天的预约状态是重置后的,完全覆盖程序未运行时的遗漏情况。
如果需要严格在凌晨12点执行重置(不受主程序运行状态影响),可以写一个独立的控制台程序只包含重置逻辑,然后通过Windows任务计划设置每天凌晨12点自动运行这个程序。
内容的提问来源于stack exchange,提问作者Javanese Python
相关产品推荐
相关产品推荐

