2013-03-15 2 views
1

Трудная ситуация здесь. Наше приложение работает в системе, которая задана с определенным TimeZone (скажем, по времени в Азии). Однако клиент запрашивает, чтобы его приложение выполнялось с использованием часовой пояс в Европе.Принудительный часовой пояс для приложения

Поскольку наши данные не хранятся в UTC, есть ли в любом случае, мы можем установить языковой стандарт в приложении, чтобы все отображаемые даты использовали TimeZone в Европе? Я понимаю, что мы можем установить информацию о культуре в Web.Config, но я не уверен, что это может помочь установить TimeZone.

BTW наше приложение работает с использованием C# WebForm и MSSQL 2008 R2.

+0

Refer. Ссылка ... Это поможет вам ... http://msdn.microsoft.com/en-us/library/bb382770.aspx – Niks

+0

@Niks спасибо за ссылку – ipohfly

ответ

2

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

Вам не нужно устанавливать это на глобальном уровне, насколько это касается .NET. У вас может быть параметр конфигурации приложения (если вы действительно этого хотите) и «вспомогательный» код для его конвертирования всякий раз, когда вы необходимо отобразить. Я бы сделал это очень четко: вы действительно не хотите, чтобы конверсии происходили неявно, когда дело доходило до времени.

(Я бы также упомянул, что моя библиотека Noda Time может пригодиться в качестве более четкого API, когда дело доходит до дат и времени. Разумеется, я предубежден. Я также предлагаю перейти на сохранение всего в UTC, если . вы можете ... и только там, где это уместно, конечно)

+0

Спасибо за предложение. Однако у нас нет возможности переписать код, чтобы поместить все в UTC, поскольку в этом проекте есть ограничение по времени. (честно говоря, я даже не думаю, что у нас есть время написать класс-помощник, который, очевидно, необходим, но ....) – ipohfly

+0

@ipohfly: Ну, я сказал, что, по моему мнению, лучший способ действий. Без подробного знания вашего проекта и временных ограничений трудно сказать, сколько хакерских ярлыков вы должны предпринять. Я бы очень опасался кратковременных исправлений, которые не затрагивают основные проблемы. –

+0

Спасибо. Другой вопрос: даже если я буду хранить все даты в формате UTC и отформатировать их до локального времени при отображении, как насчет тех данных, которые отображаются в отчетах RDLC? что может быть достигнуто также? Спасибо за ваше мнение :) – ipohfly

1

вы должны хранить даты с DateTimeOffset:

Представляет точку во времени, как правило, выражается в виде даты и времени день, относительная к скоординированному универсальному времени (UTC).

Использование DateTimeOffset имеет большие преимущества, так как эти даты легко конвертируются в любой часовой пояс, не теряя при этом смещение, где произошло событие (т.е. хранить некоторые данные в какой-то момент времени).

Как пояснил Джон Скит в комментарии в моем ответе, необходимо сохранить идентификатор часового пояса вместе с DateTimeOffset, чтобы получить полную дату + информацию о времени и сделать ее полностью конвертируемой.

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

Наконец, вы можете преобразовать такие DateTimeOffset используя this TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) overload.

+2

'DateTimeOffset' * * * потеряет часовой пояс, где произошло событие. Он не теряет местное время, но утрачивает часовой пояс. В любой момент времени может быть несколько часовых поясов с использованием одного и того же смещения. –

+0

@JonSkeet В общих чертах, он не теряет его. Часовые пояса представляют собой чрезвычайно сложную проблему, я знаю (я прочитал много статей, в том числе некоторые из ваших: D). В зависимости от того, какая демография входит на ваш сайт, 'DateTimeOffset' может быть достаточно, что вы думаете? –

+1

В * общих * терминах это, безусловно, потеряет его. В некоторых * конкретных * случаях это может и не быть. Но если вы действительно заботитесь о часовом поясе, вы должны это знать и хранить. Если в это мгновение вас интересует только местное время, то 'DateTimeOffset' в порядке. Я не говорю, что 'DateTimeOffset' всегда неуместно, хотя во многих случаях вы действительно не знаете, что такое локальное время, а UTC' DateTime' в порядке - я в основном спорю с вашими утверждениями о том, что он не теряет часовой пояс. –

0

Как об изменении локали?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; 
if (currentCulture.Name != "sv-SE") 
{ 
    // Change the current culture to sv-SE and serialize the date. 
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("sv-SE"); 
} 

// Do something with a date in swedish timeZone 
var swedishNow = DateTime.Now; 

// Restore back to the original culture, when finished 
Thread.CurrentThread.CurrentCulture = currentCulture; 
Смежные вопросы