c# 缩短日期最终会增加一天

c# making a short date ends up adding one day

我想缩短约会时间,结果多了一天。日期如“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
            {
            }

看起来您将时间设置为与 UTC 时间完全一致,然后将其转换为本地时间。此转换将时间增加了几个小时,并因此将日期向前移动。

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

这是由于 ParseExact return 一个 DateTimeKind 属性 值为 DateTimeKind.Unspecified

当您处于与 UTC 具有正偏移的时区时,如果与对 .ToLocalTime() 的调用相结合,则会将 DateTime 值向前推进那么多小时,并且 return DateTime 值和 Kind 属性 值 DateTimeKind.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.

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

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