2015-09-25 2 views
1

Я хочу добавить минуты до времени, когда время меняется. Например.Добавить минут до времени во время изменения

В период 24-10-2015 время в 3 часа времени возвращается на один час назад.

Итак, когда у нас есть 2:20 утра, через 50 минут у нас есть 2:10 утра.

var date = new DateTime(2015,10,24, 2,20, 00); 
Console.WriteLine(date.AddMinutes(50).ToString()); 

Обратный код возврата 3:10, и это неправильно.

Как это исправить? Это зависит от страны и часового пояса.

ответ

0

Большая ошибка, с которой вы сталкиваетесь, заключается в том, что время не возвращается в час 24 октября, а на 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), как система должна знать, означает ли вы первое или второе? Это даже не ясно, в каком часовом поясе вы ожидаете, чтобы быть в

В Нода времени, код будет выглядеть примерно так:.

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, мы надеемся сделать вещи проще для обычных случаев.)

0

вы можете использовать TimeZoneInfo для перфорирования 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 
Смежные вопросы