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 一个 DateTime
的 Kind
属性 值为 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
我想缩短约会时间,结果多了一天。日期如“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 一个 DateTime
的 Kind
属性 值为 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