Aracılığıyla paylaş


Nasıl yapılır: Saat dilimlerini katıştırılmış kaynağa kaydetme

Saat dilimi kullanan bir uygulama genellikle belirli bir saat diliminin varlığını gerektirir. Ancak, tek tek TimeZoneInfo nesnelerin kullanılabilirliği yerel sistemin kayıt defterinde depolanan bilgilere bağlı olduğundan, özel olarak kullanılabilir saat dilimleri bile bulunmayabilir. Ayrıca, yöntemi kullanılarak CreateCustomTimeZone örneklene özel saat dilimleri hakkındaki bilgiler kayıt defterindeki diğer saat dilimi bilgileriyle birlikte depolanmaz. Bu saat dilimlerinin gerektiğinde kullanılabilir olduğundan emin olmak için bunları seri hale getirerek kaydedebilir ve daha sonra seri durumdan çıkararak geri yükleyebilirsiniz.

Genellikle, bir TimeZoneInfo nesneyi seri hale getirme, saat dilimini kullanan uygulama dışında gerçekleşir. Serileştirilmiş TimeZoneInfo nesneleri tutmak için kullanılan veri deposuna bağlı olarak, saat dilimi verileri bir kurulum veya yükleme yordamının (örneğin, veriler kayıt defterinin uygulama anahtarında depolandığında) veya son uygulama derilmeden önce çalışan bir yardımcı program yordamının parçası olarak (örneğin, serileştirilmiş veriler bir .NET XML kaynağı (.resx) dosyasında depolandığında) seri hale getirilebilir.

Uygulamayla derlenen bir kaynak dosyasına ek olarak, saat dilimi bilgileri için başka birçok veri deposu kullanılabilir. Bunlar aşağıdakileri içerir:

  • Kayıt defteri. Bir uygulamanın, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones alt anahtarlarını kullanmak yerine özel saat dilimi verilerini depolamak için kendi uygulama anahtarının alt anahtarlarını kullanması gerektiğini unutmayın.

  • Yapılandırma dosyaları.

  • Diğer sistem dosyaları.

Saat dilimini bir .resx dosyasına seri hale getirerek kaydetmek için

  1. Mevcut bir saat dilimini alın veya yeni bir saat dilimi oluşturun.

    Var olan bir saat dilimini almak için bkz . Nasıl yapılır: Önceden tanımlanmış UTC ve yerel saat dilimi nesnelerine erişme ve Nasıl yapılır: TimeZoneInfo nesnesi örneği oluşturma.

    Yeni bir saat dilimi oluşturmak için yönteminin aşırı yüklemelerinden birini çağırın CreateCustomTimeZone . Daha fazla bilgi için bkz . Nasıl yapılır: Ayarlama kuralları olmadan saat dilimleri oluşturma ve Nasıl yapılır: Ayarlama kurallarıyla saat dilimleri oluşturma.

  2. Saat dilimi verilerini ToSerializedString içeren bir dize oluşturmak için yöntemini çağırın.

  3. Sınıf oluşturucusunun adını ve isteğe bağlı olarak .resx dosyasının yolunu sağlayarak bir StreamWriter nesne örneği StreamWriter oluşturma.

  4. ResXResourceWriter Nesnesini sınıf oluşturucusunun StreamWriter öğesine geçirerek bir nesnenin örneğini ResXResourceWriter oluşturma.

  5. Saat diliminin serileştirilmiş dizesini yöntemine ResXResourceWriter.AddResource geçirin.

  6. yöntemini çağırın ResXResourceWriter.Generate .

  7. yöntemini çağırın ResXResourceWriter.Close .

  8. StreamWriter yöntemini çağırarak Close nesnesini kapatın.

  9. Oluşturulan .resx dosyasını uygulamanın Visual Studio projesine ekleyin.

  10. Visual Studio'daki Özellikler penceresini kullanarak .resx dosyasının Derleme Eylemi özelliğinin Eklenmiş Kaynak olarak ayarlandığından emin olun.

Örnek

Aşağıdaki örnek, Merkezi Standart Saati temsil eden bir TimeZoneInfo nesneyi ve Palmer İstasyonu, Antarktika saatini temsil eden bir TimeZoneInfo nesneyi SerializedTimeZones.resx adlı bir .NET XML kaynak dosyasına serileştirir. Merkezi Standart Saat genellikle kayıt defterinde tanımlanır; Palmer İstasyonu, Antarktika özel bir saat dilimi.

TimeZoneSerialization()
{
   TextWriter writeStream;
   Dictionary<string, string> resources = new Dictionary<string, string>();
   // Determine if .resx file exists
   if (File.Exists(resxName))
   {
      // Open reader
      TextReader readStream = new StreamReader(resxName);
      ResXResourceReader resReader = new ResXResourceReader(readStream);
      foreach (DictionaryEntry item in resReader)
      {
         if (! (((string) item.Key) == "CentralStandardTime" ||
                ((string) item.Key) == "PalmerStandardTime" ))
            resources.Add((string)item.Key, (string) item.Value);
      }
      readStream.Close();
      // Delete file, since write method creates duplicate xml headers
      File.Delete(resxName);
   }

   // Open stream to write to .resx file
   try
   {
      writeStream = new StreamWriter(resxName, true);
   }
   catch (FileNotFoundException e)
   {
      // Handle failure to find file
      Console.WriteLine("{0}: The file {1} could not be found.", e.GetType().Name, resxName);
      return;
   }

   // Get resource writer
   ResXResourceWriter resWriter = new ResXResourceWriter(writeStream);

   // Add resources from existing file
   foreach (KeyValuePair<string, string> item in resources)
   {
      resWriter.AddResource(item.Key, item.Value);
   }

   // Serialize Central Standard Time
   try
   {
      TimeZoneInfo cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
      resWriter.AddResource(cst.Id.Replace(" ", string.Empty), cst.ToSerializedString());
   }
   catch (TimeZoneNotFoundException)
   {
      Console.WriteLine("The Central Standard Time zone could not be found.");
   }

   // Create time zone for Palmer, Antarctica
   //
   // Define transition times to/from DST
   TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0),
                                                                                              10, 2, DayOfWeek.Sunday);
   TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0),
                                                                                            3, 2, DayOfWeek.Sunday);
   // Define adjustment rule
   TimeSpan delta = new TimeSpan(1, 0, 0);
   TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1),
                                         DateTime.MaxValue.Date, delta, startTransition, endTransition);
   // Create array for adjustment rules
   TimeZoneInfo.AdjustmentRule[] adjustments = {adjustment};
   // Define other custom time zone arguments
   string DisplayName = "(GMT-04:00) Antarctica/Palmer Time";
   string standardName = "Palmer Standard Time";
   string daylightName = "Palmer Daylight Time";
   TimeSpan offset = new TimeSpan(-4, 0, 0);
   TimeZoneInfo palmer = TimeZoneInfo.CreateCustomTimeZone(standardName, offset, DisplayName, standardName, daylightName, adjustments);
   resWriter.AddResource(palmer.Id.Replace(" ", String.Empty), palmer.ToSerializedString());

   // Save changes to .resx file
   resWriter.Generate();
   resWriter.Close();
   writeStream.Close();
}
Private Sub SerializeTimeZones()
    Dim writeStream As TextWriter
    Dim resources As New Dictionary(Of String, String)
    ' Determine if .resx file exists
    If File.Exists(resxName) Then
        ' Open reader
        Dim readStream As TextReader = New StreamReader(resxName)
        Dim resReader As New ResXResourceReader(readStream)
        For Each item As DictionaryEntry In resReader
            If Not (CStr(item.Key) = "CentralStandardTime" Or _
                    CStr(item.Key) = "PalmerStandardTime") Then
                resources.Add(CStr(item.Key), CStr(item.Value))
            End If
        Next
        readStream.Close()
        ' Delete file, since write method creates duplicate xml headers
        File.Delete(resxName)
    End If

    ' Open stream to write to .resx file
    Try
        writeStream = New StreamWriter(resxName, True)
    Catch e As FileNotFoundException
        ' Handle failure to find file
        Console.WriteLine("{0}: The file {1} could not be found.", e.GetType().Name, resxName)
        Exit Sub
    End Try

    ' Get resource writer
    Dim resWriter As ResXResourceWriter = New ResXResourceWriter(writeStream)

    ' Add resources from existing file
    For Each item As KeyValuePair(Of String, String) In resources
        resWriter.AddResource(item.Key, item.Value)
    Next
    ' Serialize Central Standard Time
    Try
        Dim cst As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
        resWriter.AddResource(cst.Id.Replace(" ", String.Empty), cst.ToSerializedString())
    Catch
        Console.WriteLine("The Central Standard Time zone could not be found.")
    End Try

    ' Create time zone for Palmer, Antarctica
    '
    ' Define transition times to/from DST
    Dim startTransition As TimeZoneInfo.TransitionTime = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#4:00:00 AM#, 10, 2, DayOfWeek.Sunday)
    Dim endTransition As TimeZoneInfo.TransitionTime = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#3:00:00 AM#, 3, 2, DayOfWeek.Sunday)
    ' Define adjustment rule
    Dim delta As TimeSpan = New TimeSpan(1, 0, 0)
    Dim adjustment As TimeZoneInfo.AdjustmentRule = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#10/1/1999#, Date.MaxValue.Date, delta, startTransition, endTransition)
    ' Create array for adjustment rules
    Dim adjustments() As TimeZoneInfo.AdjustmentRule = {adjustment}
    ' Define other custom time zone arguments
    Dim DisplayName As String = "(GMT-04:00) Antarctica/Palmer Time"
    Dim standardName As String = "Palmer Standard Time"
    Dim daylightName As String = "Palmer Daylight Time"
    Dim offset As TimeSpan = New TimeSpan(-4, 0, 0)
    Dim palmer As TimeZoneInfo = TimeZoneInfo.CreateCustomTimeZone(standardName, offset, DisplayName, standardName, daylightName, adjustments)
    resWriter.AddResource(palmer.Id.Replace(" ", String.Empty), palmer.ToSerializedString())

    ' Save changes to .resx file 
    resWriter.Generate()
    resWriter.Close()
    writeStream.Close()
End Sub

Bu örnek, derleme zamanında bir kaynak dosyasında kullanılabilmeleri için nesneleri seri hale getirmektedir TimeZoneInfo .

ResXResourceWriter.Generate yöntemi bir .NET XML kaynak dosyasına tüm üst bilgi bilgilerini eklediğinden, var olan bir dosyaya kaynak eklemek için kullanılamaz. Örnek, SerializedTimeZones.resx dosyasını denetleyerek ve varsa iki serileştirilmiş saat dilimi dışındaki tüm kaynaklarını genel Dictionary<TKey,TValue> bir nesneye depolayarak bunu işler. Ardından mevcut dosya silinir ve mevcut kaynaklar yeni bir SerializedTimeZones.resx dosyasına eklenir. Serileştirilmiş saat dilimi verileri de bu dosyaya eklenir.

Kaynakların anahtar (veya Ad) alanları eklenmiş alanlar içermemelidir. Replace(String, String) yöntemi, saat dilimi tanımlayıcılarındaki tüm katıştırılmış alanları kaynak dosyasına atanmadan önce kaldırmak için çağrılır.

Kod derleme

Bu örnek şunları gerektirir:

  • System.Windows.Forms.dll ve System.Core.dll başvurularının projeye eklenmesi.

  • Aşağıdaki ad alanlarının içeri aktarılacağı:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
    
    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    

Ayrıca bkz.