SORU
28 EYLÜL 2011, ÇARŞAMBA


Ne kadar zarif dilimleri ile başa çıkmak için

Kullanıcılar uygulamayı kullanarak daha farklı bir zaman dilimi içinde barındırılan bir web sitesi var. Buna ek olarak, kullanıcıların belirli bir zaman dilimi olabilir. Kullanıcılar ve uygulamalar bu yaklaşımın nasıl merak ediyorum? En belirgin tarafı DB içinde, tarih/times UTC saklanır. Sunucuda, tüm tarihi ne zaman/zamanlar UTC ele alınmalıdır. Ancak, üstesinden gelmek için çalışıyorum bu üç sorun görüyorum:

  1. UTC geçerli saati (kolayca DateTime.UtcNow ile çözüldü).

  2. Veritabanından tarih/times çekerek ve kullanıcı için bu gösteriliyor. Potansiyel olarak vardırçokfarklı görüşlere baskı tarihler için çağırır. Görünümü ve bu sorunu çözebilir denetleyicileri arasında bazı katman düşünüyordum. Veya DateTime özel uzantısı bir yöntem olması (aşağıya bakınız). Büyük aşağı tarafındaherkonum görünümünde bir datetime kullanarak, uzatma yöntemi çağrılmalıdır!

    Bu da JsonResult gibi bir şey kullanmak için zorluk ekleyin. Artık kolay Json(myEnumerable.Select(transformAllDates)) olmalı Json(myEnumerable), diyebilirsiniz. Belki AutoMapper bu durumda yardımcı olabilir mi?

  3. Kullanıcı (UTC Yerel) katkılarıyla alma. Örneğin, bir tarih ile bir formu Göndermeden önce UTC tarih dönüştürme gerektirir. Akla gelen ilk şey 6* *özel yaratıyor.

İşte görünümleri kullanarak 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);
    }
}

Dilimleri ile ilgili sunucunun yerel zaman beklenen zaman daha farklı bir bölge olabilir uygulamalarının bir çok düşünürsek, şimdi bulut tabanlı ortak bir şey olacağını düşünüyorum.

Bu zarif önce çözüldü? Atladığım bir şey var mı? Fikirler ve düşünceler çok takdir edilir.

DÜZENLEME:Bazı karışıklığı temizlemek için düşündüm biraz daha bilgi ekleyin. Sorun değilnasıldb UTC kez depolamak, UTC -^ giden süreci hakkında daha fazla bilgi var . Yerel ve Yerel->UTC. @Max Zerbini işaret ettiği gibi, belli ki akıllı UTC->Görünümünde yerel kod ama DateTimeExtensions gerçekten bir Çözüm mü kullanıyor? Zaman giriş kullanıcı, mantıklı mı kabul tarihleri kullanıcının yerel zaman (bu ne olurdu JS kullanarak) ve daha sonra kullanmak ModelBinder dönüştürme UTC? Kullanıcının saat dilimi DB saklanır ve kolayca alınır.

CEVAP
28 EYLÜL 2011, ÇARŞAMBA


Bu bir öneri, bir paradigma daha fazla paylaşan değil, ama çoğuagresifbir web uygulaması zaman diliminin bilgi işleme gördüğüm şekilde ASP.NET MVC için özel olan) şu oldu:

  • Sunucu üzerindeki tüm tarihi zamanlar UTC. Söyledin, DateTime.UtcNow gibi kullanarak, anlamına gelir.

  • İstemci sunucu mümkün olduğunca az dayanıyor geçen güven çalışın. Eğer ihtiyacınız varsa örneğin, "şimdi", istemci üzerinde bir tarih oluşturmak ve sunucuya geçirmek yok. Ya senin ve ViewModel pas içinde bir tarih oluşturmak veya SONRASI DateTime.UtcNow.

Şimdiye kadar, oldukça standart ücret, ama bu şeyler nereden 'ilginç'.

  • Eğer istemciden bir tarih kabul etmek varsa, o zaman javascript sunucuya gönderdiğiniz verileri UTC olduğundan emin olmak için kullanın. İstemci UTC içine makul bir doğruluk ile bir kez dönüştürmek, böylece içinde ne olduğunu bilir.

  • Görüş oluşturma, HTML5 <time> element kullanıyorlar, hiç datetimes doğrudan ViewModel vermek isterler. HtmlHelper uzantısı Html.Time(Model.when) gibi bir şey olarak uygulanmıştır. <time datetime='[utctime]' data-date-format='[datetimeformat]'></time> vermek istiyorsunuz.

    Sonra javascript istemcileri yerel zaman UTC zaman çevirmek için kullanırlar. Script <time> tüm öğeleri bulmak ve biçimi date-format veri özelliği tarih ve eleman içeriğini doldurmak.

Bu şekilde asla parça, mağaza ya da müşterilerine bir zaman dilimi yönetmek tutmak zorunda kaldı. Sunucu istemci içinde ne olduğunu umursamadı, ne de herhangi bir zaman dilimi çeviriler yapmak zorunda kaldı. Sadece UTC tükürdü ve müşteri makul bir şey haline dönüştürmek. Bu zaman dilimi ne biliyor çünkü tarayıcıdan kolay. Eğer müşteri kendi dilimi değişirse, web uygulama otomatik olarak kendini günceller. Onlar saklı olan tek şey kullanıcı yerel ayarı için datetime biçim dizesi.

En iyi yaklaşım olduğunu söylemiyorum, ama daha önce görmediğim farklı bir gündü. Belki bazı ilginç fikirleri toplamaktadır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • waterfairy17

    waterfairy17

    9 Aralık 2007