在更改时间时向日期添加分钟数

本文关键字:日期 添加 分钟 时间 | 更新日期: 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