2015-03-12 3 views
2

Я пишу код, в котором у меня есть DateTime в UTC, и мне нужно отобразить это как LocalTime, где у меня есть объект Culture для двух часовых поясов.Работа с временными зонами DateTime

Вот мой код:

public void CultureDateTimeLocalTime() 
{ 
    DateTime dateTimeUtcNow = DateTime.UtcNow; 
    DateTime convertedDate = DateTime.SpecifyKind(dateTimeUtcNow, DateTimeKind.Utc); 
    DateTime dateTimeLocalTime = convertedDate.ToLocalTime(); 

    String format = "MM/dd/yyyy hh:mm:sszzz"; 

    string localTime = dateTimeLocalTime.ToString(format); 

    CultureInfo cultureNZ = new CultureInfo("en-NZ"); 
    CultureInfo cultureUS = new CultureInfo("en-US"); 

    DateTime DateTimeNZ; 
    bool parseNZ = DateTime.TryParse(localTime, cultureNZ, DateTimeStyles.None, out DateTimeNZ); 
    string outputNZ = DateTimeNZ.ToString("F"); 

    DateTime DateTimeUS; 
    bool parseUS = DateTime.TryParse(localTime, cultureUS, DateTimeStyles.None, out DateTimeUS); 
    string outputUS = DateTimeUS.ToString("F"); 
} 

public void CultureDateTimeLocalTime2() 
{ 
    DateTime dateTimeUtcNow = DateTime.UtcNow; 
    DateTime convertedDate = DateTime.SpecifyKind(dateTimeUtcNow, DateTimeKind.Utc); 
    DateTime dateTimeLocalTime = convertedDate.ToLocalTime(); 

    String format = "MM/dd/yyyy hh:mm:sszzz"; 

    string localTime = dateTimeLocalTime.ToString(format); 

    CultureInfo cultureNZ = new CultureInfo("en-NZ"); 
    CultureInfo cultureUS = new CultureInfo("en-US"); 

    DateTime DateTimeNZ = DateTime.ParseExact(localTime, format, cultureNZ.DateTimeFormat); 
    string outputNZ = DateTimeNZ.ToString("F"); 

    DateTime DateTimeUS = DateTime.ParseExact(localTime, format, cultureUS.DateTimeFormat); 
    string outputUS = DateTimeUS.ToString("F"); 
} 

В обеих функциях, то outputNZ и outputUS одинаковы. Почему это?

Заранее спасибо.

ответ

5

CultureInfo содержит правила для даты, времени и номеров форматирования для определенной культуры. Нет правил о часовом поясе этой культуры, потому что для большинства культур и часовых поясов нет взаимно однозначного соответствия, поэтому вы не можете использовать CultureInfo, чтобы волшебным образом учитывать часовые пояса, когда дата форматируется как строка.

Что вам нужно, это Новая Зеландия TimeZoneInfo:

var nzTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time"); 
var utcNow = DateTime.UtcNow; 
var nzNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, nzTimeZoneInfo); 
var outputNz = nzNow.ToString("F", CultureInfo.GetCultureInfo("en-NZ")); 

Вы можете использовать ту же логику, чтобы преобразовать в США часового пояса, но здесь становится очевидным, что вы не можете вывести временную зону из CultureInfo, поскольку У США много часовых поясов, и вам нужно решить, что использовать.

Кроме того, при работе с датой и временем вы должны преобразовать только формат строки на последнем шаге. Ваш код работает, потому что вы тщательно контролируете формат, который используете для округления до строки, но этот раунд не нужен, и я исправил множество ошибок, когда этот код «туда и обратно» имел неявное предположение о региональных настройках компьютер, который не всегда был прав, когда код был выполнен в другой среде.

+0

Спасибо за ваш ответ. – user3736648

+0

TL; DR: вместо использования 'DateTime dateTimeLocalTime = utcDate.ToLocalTime();', используйте 'TimeZoneInfo.ConvertTimeFromUtc' для преобразования часового пояса. – Fendy

0

Отказ от ответственности: Я проверил это только со вторым методом.

Оба метода синтаксического анализа в DateTime но вы выводите с тем же ToString, вы можете отформатировать эту строку с DateTimeFormatInfo.LongDatePattern

string outputNZ = DateTimeNZ.ToString(cultureNZ.DateTimeFormat.LongDatePattern); 
string outputUS = DateTimeUS.ToString(cultureUS.DateTimeFormat.LongDatePattern); 
// or string outputUS = DateTimeUS.ToString(cultureUS.DateTimeFormat); 

IDEOne Example

Из документации DateTime.ToString

Этот метод использует информацию форматирования, полученную из текущего культура

Поскольку ваша культура никогда не меняется, на выходе не

либо
Смежные вопросы