You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#图书馆预约系统:DateTime区分AM/PM及凌晨12点重置实现问询

问题

我是C#新手,对耦合技术了解有限,正在为学校图书馆开发预约系统,已实现仅需文件名和输入参数的Writer方法。有两个问题:

  1. 在if语句中使用什么语法区分AM与PM?
  2. 在另一个窗体中实现凌晨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):

  1. 通过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文件写入逻辑
    }
    
  2. 通过格式化字符串获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:20:32