2015-09-25 126 views
1

我想添加分钟以更新时间。例如。在时间更改期间添加分钟日期

在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,这是错误的。

我该如何解决?这取决于国家和时区。

回答

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 
2

这类事情正是我开始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,这有些变化,希望能让事情变得更简单。)

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