2008-10-21 16 views
13

Yazdığım bir web uygulamasına sahibim (C#, MSSQL) ve bir kayıt sistemde saklandığında zaman damgasını depolamam gerekiyor. Normalde, bunu SQL ve DATETIME işleviyle yapardım. Ancak, sunucu firmamızın bulunduğu yerden farklı bir saat diliminde yer alıyor ... VE biz tamamen farklı bir saat diliminde başka bir sunucuya değişebilir. Hosting şirketi, yerel saat dilimimizle eşleşmesi için sunucu saatini değiştirmeyecektir. (Onları suçlamıyorum, ama denediğim bir şeydi.)SQL'de zaman depolaması nasıl yapılır

Benim sorum şu ki, kayıt güncellemesinin tarihini/saatini saklamanın en iyi yolu nedir ve bunu sunmanın en iyi yolu nedir? Yerel saat dilimimizde kullanıcıya tarih/saat geri dönüyor mu?

Bunu yapmanın en az karmaşık yolunu istiyorum, bu yüzden çözümün uygulanması kolay olduğu sürece C# ve SQL'den oluşan bir kombinasyon iyi olur. (Normal stilim saklı yordamlarda daha fazla çalışma yapmak ve eğer önemliyse C# daha azını yapmaktır.)

Bana bir örnek kod gösterebilir misiniz? Teşekkürler!

cevap

17

daima evrensel saat içinde DATETIME veri

  • bu her zaman dilimi
  • bu kaçınır günışığı-tasarruf zamanlı sorunları
  • bu basit tarihini verir sorunları önler (UTC aka GMT) depolamak Her zaman iş için matematik
  • Bu, farklı zaman dilimlerindeki hareketlerin senkronizasyon içinde kalmasına izin verir
  • bu, verileri farklı bir saat diliminde farklı bir sunucuya taşımanıza ve
  • vb.

C# DateTime DateTime.UtcNow ve ToLocalTime() sağlar, SQL GETUTCDATE() sağlar. İşte UTC yerel saate dönüştürmek için bir SQL fonksiyonu var -

-- convert UTC to local time 
create FUNCTION [dbo].[udfUtcToLocalTime] 
(
    @gmt datetime 
) 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @dt datetime 
    SELECT 
     @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt) 
    RETURN @dt 
END 

örnek: Saklı prosedürlerde

SELECT dbo.udfUtcToLocalTime(someDateTimeField) 
FROM someTable 
+0

Timzeone ofset yaz saati nedeniyle değiştiğinde bu işlev başarısız olur. –

+0

@ [Dave Markle]: Gün ışığından yararlanma saati değiştiğinde değişmesi gerekiyor! –

+0

Demek istediğim, geçen haftaya ait bilgilere baktığınız zaman, tarih değişikliğinden önce, geçen haftaki sapma değil, bugünkü ofset ile göreceksiniz. İşlevi, yalnızca bugünün offsetine göre yerel saatleri görmek istiyorsanız çalışır. .Net işlevi DateTime.ToLocalTime bu şekilde çalışmaz. Yerel saatin o tarihteki ofsete dayandığını size gösterecektir. –

7

kaydet UTC veritabanınızda süreleri ve o zamanlarda bir kullanıcıya UTC zamanı olarak

+1

getUTCDate (kullanın) yerine uygulamadan sağlayan değilse GETDATE() ait. – tvanfosson

4

Store'dan onlara göstermek istiyorum ve sonra C# istemci ucunda saat dilimi hesaplama preform her zaman lokalize .ToUniversalTime (kullanmak) UTC zamanını almak için DateTime nesnesinde, sunucuda saklayın ve daha sonra dönüştürmek için .ToLocalTime() öğesini kullanın.

+0

Bu, C# 'da kendi ToLocalTime uzantı yöntemim dışında yaptığım şeylere benzer. Bunun nedeni, web sunucusunun ABD'de bulunması, ancak zamanların Avustralya zamanlarında görünmesini istiyorum. – Craig