我想添加分钟以更新时间。例如。在时间更改期间添加分钟日期
在24-10-2015时间的3点钟时间在后面追溯一个小时。
所以当我们有2:20 AM时,50分钟后我们有2:10 AM。
var date = new DateTime(2015,10,24, 2,20, 00);
Console.WriteLine(date.AddMinutes(50).ToString());
上面的代码返回3:10,这是错误的。
我该如何解决?这取决于国家和时区。
我想添加分钟以更新时间。例如。在时间更改期间添加分钟日期
在24-10-2015时间的3点钟时间在后面追溯一个小时。
所以当我们有2:20 AM时,50分钟后我们有2:10 AM。
var date = new DateTime(2015,10,24, 2,20, 00);
Console.WriteLine(date.AddMinutes(50).ToString());
上面的代码返回3:10,这是错误的。
我该如何解决?这取决于国家和时区。
你面对的最大错误是,时间不会在24小时后回到10月,而是在25日。
你可以试试下面的代码:
var date = new DateTime(2015, 10, 25, 1, 20, 00).ToUniversalTime();
Console.WriteLine($"UTC: {date}\tDST: {date.ToLocalTime().IsDaylightSavingTime()}\t{date.ToLocalTime()}");
date = date.AddMinutes(50);
Console.WriteLine($"UTC: {date}\tDST: {date.ToLocalTime().IsDaylightSavingTime()}\t{date.ToLocalTime()}");
date = date.AddMinutes(50);
Console.WriteLine($"UTC: {date}\tDST: {date.ToLocalTime().IsDaylightSavingTime()}\t{date.ToLocalTime()}");
date = date.AddMinutes(50);
Console.WriteLine($"UTC: {date}\tDST: {date.ToLocalTime().IsDaylightSavingTime()}\t{date.ToLocalTime()}");
,你将获得UTC + 1(CEST UTC + 2)以下的输出:
UTC: 24.10.2015 23:20:00 DST: True 25.10.2015 01:20:00
UTC: 25.10.2015 00:10:00 DST: True 25.10.2015 02:10:00
UTC: 25.10.2015 02:00:00 DST: False 25.10.2015 02:00:00
UTC: 25.10.2015 01:50:00 DST: False 25.10.2015 02:50:00
这类事情正是我开始Noda Time项目的原因。它挑逗你可能有的假设。例如,在您的示例中,上午2:20发生两次 - 因此,当您说new DateTime(2015,10,24, 2,20, 00)
系统如何知道您是指第一次出现还是第二次出现?它甚至不是清楚你希望它是在哪个时区
在Noda时间,代码将是这样的:
var local = new LocalDateTime(2015, 10, 24, 2, 20, 0);
var zone = DateTimeZoneProviders.Tzdb[yourTimeZoneId];
// Apparently you want ambiguous times to resolve as the earlier
// occurrence.
var resolver = Resolvers.CreateMappingResolver(
Resolvers.ReturnEarlier, Resolvers.ThrowWhenSkipped);
// This is now the *first* occurrence of 2:20am
var zoned = local.InZone(zone, resolver);
// This is now the *second* occurrence of 2:10am
var laterZoned = zoned.Plus(Duration.FromMinutes(50));
注意如何一切是很多在这里更加明确。你不需要有来创建你自己的解析器,在很多情况下 - 你可以使用InZoneStrictly
,这会导致不明确的或跳过的时间,而InZoneLeniently
,这将取得后面的模糊的时间,并且间隔的开始经过跳过时间的差距。 (对于野田时间2.0,这有些变化,希望能让事情变得更简单。)
可以使用TimeZoneInfo
为PErF orm的计算,但你需要使用DateTimeOffset
而不是DateTime
。这也解决了发生两次的时间戳2015-10-25 02:20:00
的不明确性。通过在时间戳的偏移量,你知道,时间戳描述的时间点DST更改前:
var date = new DateTimeOffset(2015, 10, 25, 2, 20, 0, TimeSpan.FromHours(2));
我认为你是在欧洲时区与偏移+01:00和+02:00在夏令时期间。通常情况下,您将通过在特定时间调用DateTimeOffset.Now
来创建此时间戳,但在此我手动创建时间戳,并且必须指定UTC偏移量。
您现在可以计算出新的时间戳提前50分钟:
Console.WriteLine(TimeZoneInfo.ConvertTime(date.AddMinutes(50), TimeZoneInfo.Local));
输出是:
25-10-2015 02:10:00 +01:00