görev WP7/Silverlight çerçeve yardımıyla arşivine edilemeyeceğini gördükten sonra evet, bu Noda Time yılında çok daha kolay olacaktır, ben küçük bir yardımcı yazdığı iş vermez:
public static class DateTimeHelper
{
/// <summary>
/// Tries to parse the given datetime string that is not annotated with a timezone
/// information but known to be in the CET/CEST zone and returns a DateTime struct
/// in UTC (so it can be converted to the devices local time). If it could not be
/// parsed, result contains the current date/time in UTC.
/// </summary>
public static bool TryParseCetCest(string s, string format, IFormatProvider provider, DateTimeStyles style, out DateTime result)
{
// Parse datetime, knowing it is in CET/CEST timezone. Parse as universal as we fix it afterwards
if (!DateTime.TryParseExact(s, format, provider, style, out result))
{
result = DateTime.UtcNow;
return false;
}
result = DateTime.SpecifyKind(result, DateTimeKind.Utc);
// The boundaries of the daylight saving time period in CET and CEST (_not_ in UTC!)
// Both DateTime structs are of kind 'Utc', to be able to compare them with the parsing result
DateTime DstStart = LastSundayOf(result.Year, 3).AddHours(2);
DateTime DstEnd = LastSundayOf(result.Year, 10).AddHours(3);
// Are we inside the daylight saving time period?
if (DstStart.CompareTo(result) <= 0 && result.CompareTo(DstEnd) < 0)
result = result.AddHours(-2); // CEST = UTC+2h
else
result = result.AddHours(-1); // CET = UTC+1h
return true;
}
/// <summary>
/// Returns the last sunday of the given month and year in UTC
/// </summary>
private static DateTime LastSundayOf(int year, int month)
{
DateTime firstOfNextMonth = new DateTime(year, month + 1, 1, 0, 0, 0, DateTimeKind.Utc);
return firstOfNextMonth.AddDays(firstOfNextMonth.DayOfWeek == DayOfWeek.Sunday ? -7 :
(-1 * (int)firstOfNextMonth.DayOfWeek));
}
}
hile olduğunu, (bu TryParseExact
tarih UTC ve tarihi dönen/yerel ayarlanır dönüştürülmüş olduğunu varsayalım yapar) olmadan bunu DateTimeStyles.AssumeUniversal bayrağı ayrıştırmak UTC olarak respecifying ve daha sonra manuel olarak bunu actu'ya ayarlayarak al UTC eşdeğeri.
Bu here bulunabilir DST kurallara uyar. Gün ışığından yararlanma saatinin başlangıcından/sonundan hemen önce/sonra tüm 4 sınır durumuyla test ettim. Bu, testin önemini bir kez daha gösterdi: Doğru sonucu üretmesini sağlamak için operatörünü <=
olarak değiştirmem gerekti.
(Ben yapmayıistemiyorum olan) burada tekerleği yeniden ediyorum his vardı, ancak bu basit bir iş için ayrılmış bir kütüphane kullanmak istemiyordu. Harika bir proje olan Noda Time'a bir göz attım ama bunun için gerekli olmadığını düşünüyorum. Ben bu küçük yardımcısı ile birilerine biraz zaman kazandırabilir umuyoruz. Tüm zaman dilimlerinde (örneğin, bunun yerine Noda Time gibi bir lib kullanmanız gerekiyorsa), ancak benim durumumda olduğu gibi sadece tek bir sabit saat dilimine sahip olduğunuz durumlarda, genel olarak jenerik değildir. ([C# fx 3.5 belirli bir süre Bölgesinde bir DateTime oluşturma] arasında
olası yinelenen http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in -c-fx-3-5) –
@Michael Haren: Hayır, bir kopyası değil. Bu soruyu sormadan önce bu konuya bir göz attım ve özel sorunuma yardımcı olmadı. –
belki bir çift değil ama ben yardımcı olacağını düşündüm –