【问题标题】:Setting datetime to a specific date by specific way通过特定方式将日期时间设置为特定日期
【发布时间】:2018-07-31 06:34:48
【问题描述】:

我有一个带有日期时间的变量,我必须通过这些规则和场景在特定日期设置它:

  • 我连接的 API 有一个每日限制,一旦达到该限制,我必须等到下一天,直到 CEST 上午 9:10

所以我一直在这样做:

  var localTime = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
  var tomorrowAt0910 = localTime.AddDays(1).Date + new TimeSpan(9, 10, 0);

我已经意识到这段代码有一个错误,因为我可以有以下场景:

  • 假设我的申请将于 7 月 30 日下午 15:00 到期,在这种情况下,上面的逻辑将是 VALID

但是

我们有一个更可能发生的下一个场景:

  • 申请将于 7 月 31 日上午 5:00 到期,在这种情况下,此逻辑有误,因为 RENEWAL DATE 将设置为 8 月 1 日上午 9:10,这很糟糕

如果应用程序在第二种情况下过期,我应该将日期设置为同一天和几个小时的差异(从早上 5 点到早上 9 点)

我该怎么做?

【问题讨论】:

  • 检查过期时间是否在9:10之前。如果是这样,请不要在当地时间添加一天。
  • 快速思考:不要添加 1 天,而是添加小时减去本地时区的日期时间偏移量。
  • @VDWWD 你能给我举个例子吗?
  • @Filburt 好的,我明白了,但你能给我举个例子吗? =)

标签: c# asp.net datetime c#-4.0


【解决方案1】:

听起来你真正想说的是:

  • 查找中欧的当前时间
  • 查找同一天上午 9:10
  • 如果上午 9:10 晚于当前时间,则添加一天

比如:

// No need to do this more than once
private static readonly TimeZoneInfo centralEuropeZone = 
    TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")

private static DateTime GetUtcResetTime()
{
    // Using UtcNow to make it clear that the system time zone is irrelevant
    var centralEuropeNow = TimeZoneInfo.ConvertTime(DateTime.UtcNow, centralEuropeZone);
    var centralEuropeResetTime = centralEuropeNow.Date + new TimeSpan(9, 10, 0);
    if (centralEuropeResetTime <= centralEuropeNow)
    {
        centralEuropeResetTime = centralEuropeResetTime.AddDays(1);
    }
    return TimeZoneInfo.ConvertTimeToUtc(centralEuropeResetTime, centralEuropeZone);
}

我已将其返回一个 UTC DateTime,因此其他代码无需担心它位于哪个区域。

【讨论】:

  • return TimeZoneInfo.ConvertTimeToUtc(centralEuropeResetTime, centralEuropeZone);返回 7:10 AM 而不是 9:10 AM...我检查了变量 centralEuropeResetTime ,现在是 9:10 AM... return 语句有问题 =(
  • @User987:它正在返回 UTC 值 - 实际上是 7:10 UTC。没什么问题...如果您的代码需要等到那个时间,UTC 值比中欧值更有用。如果您真的想要当地时间,只需返回 centralEuropeResetTime - 但我认为这不是一个好主意,因为调用者需要知道时区。
  • 好的,明白了 =) 你能告诉我一些这样的场景更有用吗?这样我才能记住它?
  • @User987: 这意味着除了这个方法之外没有代码需要知道重置时间是中欧时间。请注意,这是无法在 DateTime 本身中编码的信息,因此您将依赖调用者阅读文档来了解如何解释 DateTime,而 UTC DateTime 值具有 Kind Utc,所以你可以知道它 UTC。如果您要使用像 Noda Time 这样的库,您可以返回一个 确实 知道特定时区的 ZonedDateTime 值,因此调用者不需要知道。
【解决方案2】:

检查过期日期是否小于当前日期,如果是则添加一天。

DateTime expireDate = new DateTime(2018, 7, 30, 22, 0, 0); //for testing

DateTime tomorrowAt0910 = DateTime.Now.Date.AddHours(9).AddMinutes(10);

if (expireDate.Date < DateTime.Now.Date)
{
    tomorrowAt0910.AddDays(1);
}

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多