【问题标题】:c# making a short date ends up adding one day时间:2019-04-01 标签:c#making a short date to add one day
【发布时间】:2016-10-05 18:49:16
【问题描述】:

我试图缩短约会时间,但结果我得到了多一天。像“2014-01-03 00:00:00”这样的日期可以,但是当时间是“23:59:59”时它会失败。

EntryDate="2014-01-03 23:59:59"

但得到结果=“2014-01-04”

  try
        {
            DateTime exact = DateTime.ParseExact(EntryDate, "yyyyMMdd", (IFormatProvider)CultureInfo.InvariantCulture);
            mventryAttrib.Value = (exact.ToLocalTime().ToString("yyyy-MM-dd"));
        }
        catch (FormatException ex)
        {
            try
            {
                DateTime exact = DateTime.ParseExact(EntryDate, "yyyy-MM-dd HH:mm:ss", (IFormatProvider)CultureInfo.InvariantCulture);
                mventryAttrib.Value = (exact.ToLocalTime().ToString("yyyy-MM-dd"));
            }
            catch
            {
            }

【问题讨论】:

  • 在对 ParseExact 的调用结束时添加 .Date 怎么样(以删除时间组件)。此外,根据原始时区,ToLocalTime() 是否不会弄乱日期?
  • 这是由于ToLocalTime。如果您所在的时区会增加小时数,那么这会将其撞到 2014-01-04。
  • 如果您不在乎时间,为什么要转换为当地时间?这将调整时间,使第二天您的时区提前。如果您只是将exact 转换为字符串,那么它将为您提供正确的日期。
  • 最有可能的问题是您将解析时间转换为本地时间。例如,如果您位于 UTC+2 时区且准确时间为 Utc,则转换后的日期时间将为“2014-1-4 1:59:59”,因此 mventryAttrib.Value 将为“2015-01-04 "。
  • 顺便说一句,您不需要使用显式转换为IFormatProvider 接口,因为CultureInfo已经 实现了它。只需CultureInfo.InvariantCulture 就足够了。

标签: c# parsing datetime localtime


【解决方案1】:

您似乎将时间设置为 UTC 时间,然后将其转换为本地时间。这种转换会增加时间的小时数,从而移动日期。

尝试exact.ToUniversalTime(),你应该得到你设置的日期。

【讨论】:

    【解决方案2】:

    这是因为ParseExact 返回了一个DateTime,其Kind 属性值为DateTimeKind.Unspecified

    当您处于与 UTC 有正偏移的时区时,再加上对 .ToLocalTime() 的调用,会将 DateTime 值向前推几个小时并返回一个 DateTime 值和KindDateTimeKind.Local 的属性值。

    这是一个简短的程序来演示:

    var exact = DateTime.ParseExact("2014-01-03 23:59:59", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"{exact} - {exact.Kind}");
    
    var local = exact.ToLocalTime();
    Console.WriteLine($"{local} - {local.Kind}");
    
    Console.WriteLine(TimeZone.CurrentTimeZone.GetUtcOffset(exact));
    

    输出(在我的机器上):

    03.01.2014 23.59.59 - Unspecified
    04.01.2014 00.59.59 - Local
    01:00.00
    

    如果您希望解析的 DateTime 值从一开始就是本地的,您应该使用相同的值创建一个特别本地的新值:

    exact = new DateTime(exact.Ticks, DateTimeKind.Local);
    

    请注意,在处理时区边界时,这可能会产生无法预料的后果。我会敦促您找到比内置 DateTime 类型更好的库,例如 Noda Time

    【讨论】:

      【解决方案3】:

      我认为这个网站可以帮助您解决问题。

      https://msdn.microsoft.com/en-gb/library/8kb3ddd4(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 2016-10-23
        • 2011-01-31
        • 2013-04-11
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多