DST içeren tarih ve saatleri işleme

Bu makalede, gün ışığından yararlanma saati (DST) ve DST 2007 değişikliklerinin belirli ürünler ve teknolojiler üzerindeki etkisini içeren tarih ve saatleri işleme açıklanmaktadır.

Orijinal ürün sürümü: Windows
Özgün KB numarası: 932955

Özet

Tarih ve saatleri işleyen uygulamalar yazan geliştiriciler, tarih işleme ve saat işleme gerçekleştiren bir veya daha fazla teknoloji kullanabilir. Özellikle, belirli temel işletim sistemi API'leri, C çalışma zamanı (CRT) ve Microsoft .NET Framework tarihleri ve saatleri dönüştürebilir veya başka bir şekilde işleyebilirsiniz. Bu makalede, tarih ve saatlerin işlenmesinde yer alan bazı genel kavramlar açıklanmaktadır.

Zaman depolama ve işleme

Zaman damgaları, tarih ve saat birleşimini belirten değerlerdir. Zaman damgalarını işlemesi gereken uygulamalar genellikle bu zaman damgalarını Evrensel Eşgüdümlü Saat 'te (UTC) depolar. UTC'nin avantajı UTC'nin evrensel olmasıdır. UTC yerel saat dilimlerine veya DST'ye tabi değildir. Ancak UTC, kullanıcı dostu veya kullanıcıların çoğuyla ilgili değildir. UTC, depolama için bariz bir seçim olsa da, görüntüleme için iyi bir seçenek değildir. Bu nedenle çoğu uygulama, kullanıcıya zaman damgasını görüntülemeden önce UTC saatini yerel saate dönüştürür. Örneğin, Windows Gezgini Yeni Teknoloji Dosya Sistemi (NTFS) dizinindeki dosyaların tarih ve saatlerini görüntülemeden önce saat dilimini ve DST ayarını UTC zaman damgasına uygular.

UTC saatinden yerel saate dönüştürme iki uzaklık uygulamak olarak düşünülebilir. Birincisi saat dilimi uzaklığı, ikincisi ise DST uzaklığıdır. Bu nedenle, yerel saat etkin bir şekilde UTC saati artı bir saat dilimi uzaklığı ve geçerli DST uzaklığıdır. Saat dilimi uzaklığı oldukça basittir. Bilgisayar belirli bir saat dilimi için yapılandırılmıştır ve bu saat dilimi UTC'den uzaklıktadır. DST uzaklığının uygulanıp uygulanmayacağını belirlemek çok daha karmaşıktır. Bu etkinlik karmaşık ve dinamik birçok kurala dayanır.

Bu karmaşık DST kuralları son zamanlarda DST 2007 ile değişmiştir. 2007'den itibaren Birleşik Devletler, DST için yeni başlangıç tarihlerini ve yeni bitiş tarihlerini benimsemiştir. Buna ek olarak, diğer ülkelerin/bölgelerin ve devletlerin, kendi denetimi altındaki saat dilimlerinde DST'nin başlangıç tarihlerini ve bitiş tarihlerini düzenli olarak değiştirmesi yaygındır. Aşağıdaki bölümde DST 2007 değişikliğinin geliştiriciyle ilgili ürünler üzerindeki etkileri açıklanmaktadır.

DST 2007 hakkında daha fazla bilgi için bkz. Yaz saati yardımı ve desteği.

Windows'ta DST 2007 efektleri

Windows Update ve Microsoft Update'te, Windows'un DST 2007 ve sonraki yıllar için değişiklikleri doğru bir şekilde uygulamasını sağlayan güncelleştirmeler sağlanır. Bu güncelleştirmeler uygulandıktan sonra Windows, bilgisayar DST'den geçerken UTC saatinden yerel saate kadar geçerli uzaklıkları doğru hesaplar. Uzaklıklar, temel API'lerin ve ağ süresiyle ilgili API'lerin uzaklıklarını içerir.

Daha fazla bilgi için bkz. Windows işletim sistemleri için Aralık 2007 toplu saat dilimi güncelleştirmesi.

C çalışma zamanı üzerindeki DST 2007 etkileri (CRT)

CRT ayrıca tarih çevirileri ve saat çevirileri de yapar. Bu nedenle, CRT de DST 2007 için yeni kuralları içerecek şekilde güncelleştirilmelidir. CRT, yalnızca TZ ortam değişkeni ayarlandığında veya temel alınan bir işletim sistemi API'si zaman çağrısı başarısız olduğunda kendi zaman işlemesini gerçekleştirir. Güncelleştirmeler, Visual Studio'nun her sürümüne dahil edilen CRT'ler ve ayrıca Windows'un içerdiği CRT'ler için kullanılabilir. Bu güncelleştirmeler, CRT'nin Birleşik Devletler saat dilimlerinde DST dönüştürmelerini doğru şekilde işlemeye devam edebilmesini sağlar.

DST 2007'nin .NET Framework etkileri

.NET Framework, temel alınan işletim sistemi çağrılarına dayanır. Bu nedenle, .NET Framework davranışı temel işletim sisteminin durumunu yansıtır. Ayrı güncelleştirme gerekmez.

Visual Studio .NET IDE'lerinde DST 2007 efektleri

Visual Studio .NET Tümleşik Geliştirme Ortamları (IDE'ler), Visual C++, Visual C# ve Visual Basic'in 2002, 2003 ve 2005 sürümlerini içerir. Bu ürünler yalnızca CRT içerdiğinden etkilenir. IDE'ye özgü güncelleştirme gerekmez.

Visual Studio 2005 Team Foundation Server'da DST 2007 efektleri

Visual Studio 2005 Team Foundation Server, tarih ve saat dönüştürmeleri için temel işletim sistemine dayanır. Bu nedenle, Visual Studio 2005 Team Foundation Server işletim sistemiyle aynı davranışı sergiler. Visual Studio 2005 Team Foundation Server ayrıca SQL Server, SQL Server Reporting Services ve Windows SharePoint Services kullanır. Bilgisayarlar işletim sistemi, SQL Server ve Windows SharePoint Services için ilgili güncelleştirmelerle güncelleştirilmelidir. Tüm ilgili güncelleştirmeler, etkilenen tüm bilgisayarlara aynı anda uygulanmalıdır. Ayrı bir Visual Studio 2005 Team Foundation Server güncelleştirmesi gerekmez.

Visual Studio 2005 Team System üzerinde DST 2007 efektleri

Visual Studio 2005 Team System işletim sistemi, Visual Studio 2005 Team Foundation Server ve CRT aracılığıyla etkilenir. Ayrı bir Visual Studio 2005 Team System güncelleştirmesi gerekmez.

Visual Basic 6.0 çalışma zamanı üzerinde DST 2007 efektleri

Visual Basic 6.0 çalışma zamanı etkilenmez.

Visual C++ 6.0 üzerinde DST 2007 efektleri

Visual C++ 6.0 artık desteklenmiyor. Daha fazla bilgi için bkz. Microsoft Yaşam Döngüsü İlkesi.

Windows Vista için Windows SDK'sı üzerinde DST 2007 efektleri

Bu Yazılım Geliştirme Seti (SDK), DST 2007 değişikliklerinden etkilenen bir CRT sürümünü içerir. Bu SDK'nın yüklenmesinin bir parçası olarak, Visual Studio 2005 CRT'yi CRT'nin o sürümünün yüklü olmadığı bilgisayarlara yükleyebilirsiniz. CRT'nin daha yeni bir sürümü zaten yüklüyse, SDK yüklemesi bu yeni sürümün üzerine yazılmaz. SDK kaldırıldığında, CRT'nin en son sürümü bilgisayarda bırakılır. SDK'yi yüklemeden önce veya yükledikten sonra Visual Studio 2005 CRT güncelleştirmesini yükleyebilirsiniz.

Windows Vista için Windows SDK, özel C++ uygulamalarının bir parçası olarak CRT'nin yeniden dağıtımı için Visual Studio 2005 CRT için bir dizi birleştirme modülü (.msm dosyaları) yükler. Yeniden dağıtılabilir CRT'yi uygulamanın yükleme klasörüne dağıtan bir uygulama, güncelleştirilmiş CRT'yi Windows Vista için Windows SDK'sından CRT .msm dosyaları yerine Visual Studio 2005 CRT güncelleştirmesinden dağıtmalıdır. Yeniden dağıtılabilir Visual Studio 2005 CRT güncelleştirmesini Windows yükleme klasörüne dağıtan bir uygulamanın bu bilgisayarlara Visual Studio 2005 CRT yeniden dağıtılabilir güncelleştirmesini uygulaması gerekir.

Windows Server 2003 R2 için platform SDK'sı üzerinde DST 2007 efektleri

Bu SDK, DST 2007 değişikliklerinden etkilenen bir CRT sürümü içerir. Müşterilerin bu SDK'nın sürüm notlarını izlemesi ve gerekirse Visual Studio 2005 CRT güncelleştirmelerini kullanması gerekir.

DST 2007'nin .NET Framework 2.0 SDK üzerindeki etkileri

Bu SDK, DST 2007 değişikliklerinden etkilenen bir CRT sürümü içerir. Bu SDK'nın yüklenmesinin bir parçası olarak, Visual Studio 2005 CRT'yi CRT'nin o sürümünün yüklü olmadığı bilgisayarlara yükleyebilirsiniz. CRT'nin daha yeni bir sürümü zaten yüklüyse, SDK yüklemesi bu yeni sürümün üzerine yazmaz. SDK kaldırıldığında, CRT'nin en son sürümü bilgisayarda bırakılır. SDK'yi yüklemeden önce veya yükledikten sonra Visual Studio 2005 CRT güncelleştirmesini yükleyebilirsiniz.

Windows'da yerel saat dönüştürme

Uygulamalar genellikle utc saatlerini kullanıcıya saat bilgilerini ve tarih bilgilerini görüntülemeden önce yerel saatlere dönüştürür. Windows, uygulamaların zaman damgası işlemesi için kullanması için çeşitli API'ler sağlar.

  • GetSystemTime() İşlev ve GetSystemTimeAsFileTime() işlev, geçerli UTC saatini bir SYSTEMTIME yapıda veya bir yapıda FILETIME alır.

  • işlevi, GetLocalTime() bir SYSTEMTIME yapıdaki geçerli yerel saati alır.

  • işlevi, GetTimeZoneInformation() bilgisayarın geçerli saat dilimini ve DST ayarını açıklayan bir TIME_ZONE_INFORMATION yapı elde eder.

  • İşlev SystemTimeToFileTime() ve FileTimeToSystemTime() işlev, yapılar ve FILETIME yapılar arasında SYSTEMTIME sıralar.

  • İşlev ve LocalFileTimeToFileTime() işlev, FileTimeToLocalFileTime() bilgisayardaki geçerli saat dilimini ve DST ayarını kullanarak UTC ile yerel saat arasında bir FILETIME yapıyı dönüştürür ve çevirir.

  • SystemTimeToTzSpecificLocalTime() İşlev ve TzSpecificTimeToSystemTime() işlev, bir yapıdaki SYSTEMTIME UTC zaman damgasını yerel SYSTEMTIME bir yapıya dönüştürür. Bu işlevler, DST için başlangıç tarihini ve bitiş tarihini belirten bir TIME_ZONE_INFORMATION yapı kullanır. Varsayılan olarak, böyle bir yapı sağlanmazsa geçerli DST kuralları kullanılır.

  • işlevi, NetRemoteTOD() sunucunun bilgilerini ve ayarlarını kullanarak uzak sunucudan saati alır.

Not

FileTimeToLocalFileTime() İşlev ve LocalFileTimeToFileTime() işlev, yalnızca geçerli saat dilimi bilgilerini ve DST bilgilerini kullanarak UTC saati ile yerel saat arasında dönüştürme gerçekleştirir. Bu dönüştürme, dönüştürülmekte olan zaman damgasından bağımsız olarak gerçekleşir.

Windows Gezgini'nde bu davranışın bir örneğini görmek için, DST kullanan bir saat diliminde bulunan bir bilgisayarda bu adımları izleyin.

Bu adımlar, sistem saatini değiştirmenizi gerektirir. Bu nedenle, bu adımları izlemeden önce bu zaman değişikliklerine tepki gösterebilecek takvim uygulamaları gibi tüm uygulamalardan çıkmanız gerekir.

  1. Bilgisayardaki tarihi bir DST günü olarak değiştirin. Örneğin, tarihi 1 Temmuz 2006 olarak ayarlayın.
  2. Aynı bilgisayardaki bir NTFS dizininde, Test.txt adlı yeni bir metin dosyası oluşturun.
  3. Dosyadaki zaman damgasının Windows Gezgini'nde aşağıdaki gibi görüntülendiğine dikkat edin:
    1/7/2006 15:37
  4. Bilgisayardaki tarihi DST olmayan bir gün olarak değiştirin. Örneğin, tarihi 1 Şubat 2007 olarak ayarlayın.
  5. Windows Gezgini penceresini yenileyin.
  6. Dosyadaki zaman damgasının Windows Gezgini'nde aşağıdaki gibi görüntülendiğine dikkat edin:
    1/7/2006 14:37

Bu önceki örnekte, dosyadaki UTC zaman damgası değişmez. Ancak, zaman damgasını yerel saate dönüştürmek için kullanılan kurallar bilgisayardaki geçerli tarihe bağlı olarak değişir. 3. adımda, 1 Temmuz DST aralığı içinde olduğundan bir DST uzaklığı uygulandı. 6. adımda, 1 Şubat DST aralığına girmediğinden DST uzaklığı uygulanmadı. Bu davranış, dosya zaman damgasının belirleyici bir şekilde yerel saate ve yerel saate dönüştürülebilmesi için oluşur.

SystemTimeToTzSpecificLocalTime() yöntemi ve yöntemi, TzSpecificTimeToSystemTime() sağlanan TIME_ZONE_INFORMATION yapıyı kullanarak UTC saati ile yerel saat arasında dönüştürülür. Saat dilimi bilgisi sağlanmazsa, bu işlevler geçerli saat dilimi kurallarını ve DST kurallarını kullanarak zaman damgasına bir DST uzaklığının uygulanması gerekip gerekmediğini belirler. Bu, şu anda etkin olan yapıyı elde etmek için yöntemini çağırmaya GetTimeZoneInformation()TIME_ZONE_INFORMATION işlevsel olarak eşdeğerdir.

Yapı, TIME_ZONE_INFORMATION DST için başlangıç tarihini ve durdurma tarihini içerir. Bu nedenle, TIME_ZONE_INFORMATION yapı geçerli saat dilimi bilgilerini kullandığında TIME_ZONE_INFORMATION , yapı geçmiş bir yanlışlığa neden olabilir. Geçerli saat dilimi bilgileri ve DST bilgileri dönüştürülmekte olan zaman damgasını yansıtmazsa bu davranış oluşabilir. Bu davranış, DST 2007'nin yalnızca DST'nin başlatıldığı ve durduğu tarihleri yöneten kurallar değiştirildiğinden etkilenir.

Bu işlevlerden geçmişe dönük olarak doğru dönüştürmeler elde etmek için, uygulama bu işlevleri çağırdığında geçmişe dönük olarak doğru TIME_ZONE_INFORMATION bir yapı sağlamalıdır.

Windows'ta dinamik saat dilimleri

Windows Vista dinamik DST saat dilimlerini tanıtır. Dinamik DST, DST sınırları yıldan yıla değişen saat dilimleri için destek sağlar. Bu kurallar kayıt defterinde depolanır. Uygulamalar işlevini kullanarak GetDynamicTimeZoneInformation() kuralları sorgulayabilir.

Dinamik saat dilimleri, özellikle yıllık DST sınırlarının önceden bilindiği yerel ayarlar için bilgisayarların daha kolay güncelleştirilmesini sağlar. Vista için Windows SDK'sının yapısı hakkında DYNAMIC_TIME_ZONE_INFORMATION daha fazla bilgi için bkz. DYNAMIC_TIME_ZONE_INFORMATION yapısı.

C çalışma zamanında yerel saat dönüştürme (CRT)

CRT temelde zaman damgalarını çevirebileceği üç moda sahiptir:

  • TZ ortam değişkeni ayarlı değilse, CRT Windows API'lerini çağırır ve bu makalede açıklandığı gibi Windows davranışını gösterir.

  • TZ ortam değişkeni ayarlanırsa, CRT bu ayarı temel alan kendi dönüştürmelerini gerçekleştirir. CRT, bu senaryoda dönüştürmeler gerçekleştirirken yeni DST 2007 kurallarına uyması için güncelleştiriliyor.

  • TZ ortam değişkeni ayarlanmadıysa ancak temel alınan Windows API'leri başarısız olursa, CRT, TZ ortam değişkeni için PST8PDT değerini kullanarak kendi dönüştürmelerine geri döner.

CRT, UTC'yi yerel saate dönüştürmek için kendi mantığını içerir. Uygulamalar işlevi gibi time() işlevlerden UTC zaman damgaları alabilir. Bu UTC zaman damgaları değerlerde time_t depolanır. Yerel saate dönüştürme işlevi gibi localtime_s() bir işlevle gerçekleştirilebilir. İşlev, localtime_s() üst bilgi dosyasında tanımlanan bir tm yapıyı Time.h doldurur. Yapı tm , TZ ortam değişkeninde tanımlanan saat dilimini ve zaman damgası zamanında geçerli olan DST kurallarını temel alır.

Not

Bu dönüştürme, Birleşik Devletler özgü kurallara uyar.

DST 2007 güncelleştirmesini uygulamadan önce, CRT geçerli zaman damgalarını Birleşik Devletler saat dilimlerinde doğru şekilde işler. DST 2007 güncelleştirmesini uyguladıktan sonra, CRT hem geçmiş hem de gelecekteki Birleşik Devletler tarihleri de işler. CRT için Güncelleştirmeler Başvurular bölümünde listelenir.

.NET Framework yerel saat dönüştürme

.NET Framework, zaman damgalarını depolayan ve dönüştüren sınıflar içerir. Bu sınıflar sınıfını, TimeZone sınıfını, sınıfını TimeSpan ve sınıfını DateTimeKind içerirDateTime. Daha önce belirtildiği gibi, bu sınıflar öncelikle temel platform uygulamasına bağlıdır. Bu sınıflar, temel işletim sistemi API'leriyle aynı davranışı sergiler.

.NET Framework tarih sınıfları ve saat sınıfları tarafından sergilenen ilginç davranışlardan biri, zaman damgasını istenen bir miktarla dengeleyen işlevlerle ilgilidir. Örneğin, işlevi, AddMinutes() işlevi ve sınıfındaki DateTimeAddSeconds() işlevi göz önünde bulundurunAddHours(). Bu işlevler ve benzer adlandırılmış işlevler, DST ayarlarına bakılmaksızın zaman damgasını istenen miktara kadar artırır. Bu davranış, temel alınan UTC zaman damgasında basit aritmetik olarak kabul edilebilir. Ancak bu davranış, ekleme zaman damgasının DST'ye geçmesine veya DST'ye geçmesine neden olduğunda beklenmeyen sonuçlara yol açabilir. Bu davranış DST 2007 değişiklikleriyle ilişkili değildir.

Öneriler

Aşağıdaki öneriler geliştiricilerin DST 2007'nin etkisini en aza indirmesine ve genel tarih ve saat işlemeyi iyileştirmesine yardımcı olabilir.

  • DST 2007 güncelleştirmelerinin neredeyse atomik bir yüklemesini planlamanız gerekir. Planlanan tüm DST 2007 güncelleştirmeleri mümkün olduğunca birbirine yakın bir zamanda uygulanmalıdır. Güncelleştirilmiş bir bilgisayar, güncelleştirilmemiş bir bilgisayarla iletişim kurmak için SQL sorguları veya Web hizmetleri gibi yöntemleri kullanmayı denerse, çeviri hataları oluşabilir. Benzer şekilde, tek bir bilgisayar Windows güncelleştirmesi ve CRT güncelleştirmesi gibi iki veya daha fazla güncelleştirme gerektiriyorsa, güncelleştirmeler aynı anda uygulanmalıdır.

  • UTC zaman damgaları geçmişe dönük olarak doğrudur. Genellikle çoğu uygulamayı ilgilendiren yerel saate dönüştürmedir. Uygulamalar her zaman UTC zaman damgalarını depolamalıdır. Görüntüleme amacıyla yerel saate dönüştürmeler için saat dilimi bilgileri ve DST bilgileri gerekir. Bu bilgiler çeşitli kaynaklardan gelebilir:

    • Uygulama, dönüştürme için geçerli saat dilimini ve DST ayarını kullanabilir. Bu, geçerli saat dilimi ve DST ayarı zaman damgası sırasında etkin değilse dönüştürmede bir yanlışlığa neden olabilir.

    • Uygulama UTC zaman damgasına ek olarak önceden doğru saat dilimi bilgilerini ve DST bilgilerini depolar.

    • Dinamik saat dilimleri kullanılabilir olduğunda, uygulama belirli bir UTC zaman damgasına hangi saat dilimi bilgilerinin uygulanması gerektiğini belirlemek için dinamik saat dilimlerini kullanabilir. Bu seçenek yalnızca dinamik saat dilimi bilgileri belirli bir zaman damgası ve belirli bir saat dilimi için kullanılabilir olduğunda kullanılabilir.

    • Uygulama yerel bir zaman damgasını ve UTC zaman damgasını depolar. Bu yöntem gelecekteki dönüştürme gereksinimini önler.

  • Zaman damgalarıyla ilgilenen bilgisayarlar arasındaki tüm iletişimlerde UTC zaman damgaları kullanılmalıdır. Bu örtük olarak iki bilgisayara da UTC için aynı bağlam bilgilerini verir.

  • Bir uygulama tarihleri işlerse, testte tarihlerin işlenme şekline dikkat etmelisiniz. Saat bilgisi olmadan görüntülenen tarihler genellikle ilgili tarihte saat 12:00'nin zaman damgası olarak depolanır. Bu nedenle, saat önceki gün 23:00'e kaydırılırsa, zaman damgasının saat bölümündeki bire bir hata geçerlilik tarihinde bire bir sonuç verebilir.

Başvurular