【问题标题】:Trying to set a datetime start time based off datetime.now尝试根据 datetime.now 设置日期时间开始时间
【发布时间】:2023-04-04 09:22:01
【问题描述】:

我正在尝试将我的 DateTime 开始变量设置为根据现在的时间进行更改。我的班次(不同的开始时间)是 1:6am-2pm 2:2pm-10pm 3:10pm-6am。我无法编写 if 语句来给出正确的时间。

短版。我正在尝试编写 C# if 语句来确定它当前是三个 start 中的哪一个。下面是代码。以上是开始时间。

我试图实现的逻辑是将 DateTime 开始变量设置为我列出的 3 个日期时间之一。早上、下午或晚上。开始变量需要根据 DateTime.Now 更改值。视图将每 15 秒刷新一次页面。这将更新 DateTime.Now 变量。

感谢您的宝贵时间。

DateTime MORNING;
        DateTime AFTERNOON;
        DateTime EVENING;
        if (DateTime.Now.Hour > 6 || (DateTime.Now.Hour == 6 && DateTime.Now.Minute >= 00))
            MORNING = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 6, 00, 0);
        else
            MORNING = new DateTime(DateTime.Now.AddDays(-1).Year, DateTime.Now.AddDays(-1).Month, DateTime.Now.AddDays(-1).Day, 6, 30, 0);

        if (DateTime.Now.Hour > 14 || (DateTime.Now.Hour == 14 && DateTime.Now.Minute >= 00))
            AFTERNOON = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 14, 00, 0);
        else
            AFTERNOON = new DateTime(DateTime.Now.AddDays(-1).Year, DateTime.Now.AddDays(-1).Month, DateTime.Now.AddDays(-1).Day, 14, 00, 0);

        if (DateTime.Now.Hour > 20 || (DateTime.Now.Hour == 20 && DateTime.Now.Minute >= 00))
            EVENING = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 00, 0);
        else
            EVENING = new DateTime(DateTime.Now.AddDays(-1).Year, DateTime.Now.AddDays(-1).Month, DateTime.Now.AddDays(-1).Day, 20, 00, 0);



        DateTime start = ((EVENING > MORNING) ? EVENING : MORNING);
        DateTime end = start.AddHours(8);

【问题讨论】:

  • 请提供您想要实现的确切逻辑,目前还不清楚。旁注:不要连接/插入 SQL 值,而是使用适当的参数化。您似乎有一个设计问题,因为您每年都有一个表,它应该是一个带有年份列的表。不要缓存连接对象。使用 using 块处理连接、命令和读取器对象
  • @Charlieface 我确实意识到当它改变月份或年份时,表格是一个大问题,但是我无法控制它。我需要使用如上所示的表格来构建程序。我试图让我的任务更清晰,并删除了一些对解决问题没有帮助的代码。
  • @Primdonm 不是真的。您可以对UNION ALL 使用视图,因此您只需查询视图。 IF 表在VDH_Date 上具有CHECK 约束,以确保仅输入正确的日期,并且 IF 在查询中使用VDH_Date,服务器将能够自动选择正确的表进行查询,而不是扫描所有表。这是一种非常早期的手工分区形式。在所有受支持的 SQL Server 版本(2016 及更高版本)中,您可以使用表分区通过单个表实现相同的目的。
  • @Primdonm 之所以有效,是因为服务器知道 CHECK 约束,因此可以消除不可能有过滤日期的表。如果没有 CHECK 约束和 WHERE 子句中的 VHD_Date,服务器将不得不扫描所有表。

标签: c# datetime


【解决方案1】:

我不确定您的代码中的其他位置是否需要MORNINGAFTERNOONEVENING 变量,但它们不是必需的;除非您在其他位置需要它们,否则我会将它们从我的样本中删除。如果确实需要这些变量,可以将我的 start 集合替换为新的 DateTime 对象,但我想证明这根本不需要额外的变量。以下应该有效:

DateTime now = DateTime.Now;
DateTime MORNING = new DateTime(now.Year, now.Month, now.Day, 6, 0, 0);
DateTime AFTERNOON = MORNING.AddHours(8);
DateTime EVENING = AFTERNOON.AddHours(8);
DateTime start;

// Note that hour 22 is 10PM, not hour 20 as in your example
if (now.Hour >= 22 || now.Hour < 6)
{
    // Evening
    start = new DateTime(now.Year, now.Month, now.Day, 22, 0, 0);
    AFTERNOON -= TimeSpan.FromDays(1);
    MORNING -= TimeSpan.FromDays(1);
}
else if (now.Hour >= 14)
{
    // Afternoon
    start = new DateTime(now.Year, now.Month, now.Day, 14, 0, 0);
    EVENING -= TimeSpan.FromDays(1);
    MORNING -= TimeSpan.FromDays(1);
}
else
{
    // Morning
    start = new DateTime(now.Year, now.Month, now.Day, 6, 0, 0);
    EVENING -= TimeSpan.FromDays(1);
    AFTERNOON -= TimeSpan.FromDays(1);
}

DateTime end = start.AddHours(8);

【讨论】:

  • 感谢您的帮助,这正是我所需要的。我看起来像是试图让它变得复杂。你有帮助拯救我的理智。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多