Uygulamayı kullanan kullanıcılardan farklı bir saat diliminde barındırılan bir web sitem var. Buna ek olarak, kullanıcılar belirli bir saat dilimine sahip olabilirler. Diğer SO kullanıcıları ve uygulamalarının buna nasıl yaklaştığını merak ediyordum? En belirgin kısım, DB içinde tarih / saatlerin UTC'de depolanmasıdır. Sunucudayken, tüm tarih / saatler UTC olarak ele alınmalıdır. Ancak üstesinden gelmeye çalıştığım üç sorun görüyorum:
UTC'de şimdiki zamanı almak (ile kolayca çözülür
DateTime.UtcNow
).Veritabanından tarih / saatlerin alınması ve kullanıcıya gösterilmesi. Farklı görünümlerde tarihleri yazdırmak için potansiyel olarak çok sayıda çağrı vardır. Bu sorunu çözebilecek görüş ve kontrolörler arasında bir katman düşünüyordum. Veya üzerinde özel bir uzantı yöntemi kullanmak
DateTime
(aşağıya bakın). En önemli tarafı, görünümde tarih saatinin kullanıldığı her yerde, uzantı yönteminin çağrılması gerektiğidir!Bu, gibi bir şeyi kullanmakta zorluk ekler
JsonResult
. Artık kolayca arayamazsınızJson(myEnumerable)
, olması gerekirdiJson(myEnumerable.Select(transformAllDates))
. Belki AutoMapper bu durumda yardımcı olabilir?Kullanıcıdan girdi alma (Yerelden UTC'ye). Örneğin, bir formun tarihle birlikte gönderilmesi için tarihin önceden UTC'ye dönüştürülmesi gerekir. Akla ilk gelen şey bir gelenek yaratmaktır
ModelBinder
.
İşte görünümlerde kullanmayı düşündüğüm uzantılar:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Zaman dilimleri ile uğraşmanın, sunucunun yerel saatinin beklenen saat diliminden çok farklı olabileceği birçok uygulama artık bulut tabanlı olduğu düşünülürse, bu kadar yaygın bir şey olacağını düşünürdüm.
Bu daha önce zarif bir şekilde çözüldü mü? Kaçırdığım bir şey var mı? Fikirler ve düşünceler çok takdir edilmektedir.
EDIT: Biraz karışıklık gidermek için biraz daha ayrıntı eklemek düşündüm. Sorun şu anda UTC saatlerini db'de nasıl saklayacağınız değil , daha çok UTC-> Yerel ve Yerel-> UTC'den gitme süreci hakkında. @Max Zerbini'nin belirttiği gibi, UTC-> Yerel kodu görünüme koymak akıllıca bir şey, ama DateTimeExtensions
gerçekten cevabı kullanıyor mu? Kullanıcıdan girdi alırken, tarihleri kullanıcının yerel saati olarak kabul etmek mantıklı olur (JS'nin kullanacağı şey budur) ve sonra ModelBinder
UTC'ye dönüştürmek için a kullanır mı? Kullanıcının saat dilimi DB'de saklanır ve kolayca alınır.
ModelBinder
.