在更改时间时向日期添加分钟数
本文关键字:日期 添加 分钟 时间 | 更新日期: 2023-09-27 18:14:34
我想在时间变化的日期中添加分钟数。如:
在2015年10月24日时间3点时间往回走一小时。
所以当我们是凌晨2:20时,50分钟后我们是凌晨2:10。
var date = new DateTime(2015,10,24, 2,20, 00);
Console.WriteLine(date.AddMinutes(50).ToString());
上面的代码返回3:10,这是错误的。
我该如何修复它?这取决于国家和时区。
这正是我开始野田时间项目的原因。它梳理了你可能有的假设。例如,在您的示例中,2:20am出现了两次-那么当您说new DateTime(2015,10,24, 2,20, 00)
时,系统如何知道您是指第一次出现还是第二次出现?它甚至不清楚你希望它在哪个时区。
在Noda Time中,代码应该是这样的:
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
将采取后的模糊时间,并开始间隔后的间隙为跳过的时间。(其中一些在Noda Time 2.0中略有改变,希望使常见情况更简单。)
您面临的最大错误是时间不会在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
您可以使用TimeZoneInfo
来执行计算,但您需要使用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));
输出为:
<>之前2015-10-25 02:10:00 +01:00