【问题标题】:Check if local date time exist NODA TIME检查本地日期时间是否存在 NODA TIME
【发布时间】:2017-01-30 05:15:02
【问题描述】:

如果日期时间确实存在,有没有办法验证它?

这可能听起来很奇怪,但如果您将夏令时应用到某个区域,例如美国/纽约 3 月 12 日。2017 年凌晨 2 点到凌晨 3 点是他们的夏令时。从 3 月 12 日开始的文学演讲。2017 年凌晨 2 点到凌晨 2 点 59 分,这在他们的时代是不存在的。我想验证给定的日期时间(如果存在)

我试过用这个

给定日期时间 = 2017 年 3 月 12 日凌晨 2:30

 var timeZoneProvider = DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York"); 
 var localDate = LocalDateTime.FromDateTime(dateTime);
 var result = timeZoneProvider.AtStrictly(localDate).ToDateTimeUtc();

它抛出错误有没有办法在使用 AtStrictly 之前对其进行验证?它抛出错误并说日期时间不存在这是由于该区域的夏令时

【问题讨论】:

    标签: c# nodatime


    【解决方案1】:

    DateTimeZone.MapLocal 方法可以为您提供此信息。这里有一些扩展方法可以让这变得简单。 (将它们放在某个静态类中。)

    public static bool IsInvalidTime(this DateTimeZone tz, LocalDateTime ldt)
    {
        return tz.MapLocal(ldt).Count == 0;
    }
    
    public static bool IsAmbiguousTime(this DateTimeZone tz, LocalDateTime ldt)
    {
        return tz.MapLocal(ldt).Count > 1;
    }
    

    那么你可以在春天做这样的事情:

    var timeZone = DateTimeZoneProviders.Tzdb["America/New_York"];
    var localDateTime = new LocalDateTime(2017, 3, 12, 2, 30);
    
    if (timeZone.IsInvalidTime(localDateTime)) { ... true ... }
    

    在秋天:

    var timeZone = DateTimeZoneProviders.Tzdb["America/New_York"];
    var localDateTime = new LocalDateTime(2017, 11, 5, 1, 30);
    
    if (timeZone.IsAmbiguousTime(localDateTime)) { ... true ... }
    

    当然,这假设您只想进行预验证。如果您想实际应用一些转换规则,那就是 AtLenientlyResolveLocal(... your custom rules ...) 的用武之地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2017-05-04
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2016-05-03
      相关资源
      最近更新 更多