我正在努力做一个简短的约会,但结果我得到了一天。日期如“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
{
}
答案 0 :(得分:3)
这是由于ParseExact
返回DateTime
,Kind
属性值为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