標準の.NETJsonシリアライザーを使用しないでください。Javaと.NETの間で作業している場合、必要以上に多くの頭痛の種が発生します。ご存知のように、Microsoftはほとんどの人が使用しない形式を使用しています。
最高のシリアライザーは、NewtonsoftのJson.NET(NuGetページ)であり、.NET開発者のデファクトスタンダードになっています。それらには、使いやすい優れたDateTimeシリアル化/逆シリアル化オプションがあります。 詳細については、DateTimeのブログ投稿をご覧ください。私は、Json.NETv4.5のデフォルト形式であるISO8601を使用する傾向があります。
私は以前、Jsonを介してさまざまな言語で作成されたさまざまな製品と通信するエンタープライズアプリケーションに取り組んでいましたが、Json.NETはその製品間の通信を簡単にしました。
スイスのDateTimeの取り扱いに関する最新情報
一般的な中央ヨーロッパ標準時を指定しているため、.NETはスイスの日時ルールが具体的に何であるかを認識していません。スイスに対処するには、.NETにスイスのルールを与える必要があります。ウィキペディアを見ると、1981年に開始されたため、カスタムの作成TimeZoneInfo
は次のようになります。
// UTC Time
var date1 = new DateTime(1969, 4, 20, 2, 20,00, DateTimeKind.Utc);
Console.WriteLine("Date 1: " + date1.ToString() + " - " + date1.IsDaylightSavingTime());
// CEST
var timezone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
var date2 = TimeZoneInfo.ConvertTimeFromUtc(date1, timezone);
Console.WriteLine("Date 2: " + date2.ToString() + " - " + date2.IsDaylightSavingTime() + " " + timezone.IsAmbiguousTime(date2));
// Switzerland
var cesAdjRule = timezone.GetAdjustmentRules().Single();
var switzerlandStartTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(
cesAdjRule.DaylightTransitionStart.TimeOfDay,
cesAdjRule.DaylightTransitionStart.Month, cesAdjRule.DaylightTransitionStart.Week,
cesAdjRule.DaylightTransitionStart.DayOfWeek
);
var switzerlandAdjustmentRule = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(
new DateTime(1981, 1, 1),
DateTime.MaxValue.Date,
cesAdjRule.DaylightDelta,
switzerlandStartTransition,
cesAdjRule.DaylightTransitionEnd
);
TimeZoneInfo.AdjustmentRule[] adjustments = {switzerlandAdjustmentRule};
var switzerlandTimeZone = TimeZoneInfo.CreateCustomTimeZone("Switzerland",
timezone.BaseUtcOffset,
"Switzerland",
"Switzerland",
"Switzerland",
adjustments, false);
var date3 = TimeZoneInfo.ConvertTimeFromUtc(date, timezone, switzerlandTimeZone);
Console.WriteLine("Date 3: " + date3.ToString() + " - " + date3.IsDaylightSavingTime() + " " + timezone.IsAmbiguousTime(date3));
その出力は次のようになります(少なくとも私のマシンでは):
Date 1: 4/20/1969 2:20:00 AM - False
Date 2: 4/20/1969 4:20:00 AM - True - False
Date 3: 4/20/1969 3:20:00 AM - True - False
ご覧のとおり、IsDaylightSavingsTimeはでTrueですがDateTime
、TimeZoneInfo
正しく変換されています。他のいくつかの組み合わせを試してみることも良さそうです。また、自分が持っていると思われるCESTとスイスの間で変換することもできますTimeZoneInfo.CovertTime()
。