c#制作一个短日期最终会增加一天

时间:2016-06-06 08:26:29

标签: c# parsing datetime localtime

我正在努力做一个简短的约会,但结果我得到了一天。日期如“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
            {
            }

3 个答案:

答案 0 :(得分:3)

这是由于ParseExact返回DateTimeKind属性值为DateTimeKind.Unspecified

当您处于与UTC有正偏移的时区时,如果再次调用.ToLocalTime(),则会将DateTime值向前推进那么多小时并返回{{ 1}} 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

请注意,在处理时区边界时,这可能会产生不可预见的后果。我建议你找一个比内置的DateTime类型更好的库,比如Noda Time

答案 1 :(得分:0)

看起来您将时间精确设置为UTC时间,然后将其转换为本地时间。这种转换增加了几个小时的时间,从而改变了日期。

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

答案 2 :(得分:-1)

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

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