0
私はDateTimeOffset
のインスタンスを持っており、夏時間ルールを考慮して、特定のTimeZone
(W.ヨーロッパ標準時)で1日追加する必要があります(Offset
変化する)。サードパーティ製のライブラリがないとどうすればいいですか?C#特定のTimeZoneからDateTimeOffsetに1日を追加する
検証可能例:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject
{
[TestClass]
public class TimeZoneTests
{
[TestMethod]
public void DateTimeOffsetAddDays_DaylightSaving_OffsetChange()
{
var timeZoneId = "W. Europe Standard Time";
var utcTimestamp = new DateTimeOffset(2017, 10, 28, 22, 0, 0, TimeZoneInfo.Utc.BaseUtcOffset);
var weuropeStandardTimeTimestamp = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcTimestamp, timeZoneId);
Assert.AreEqual(new DateTime(2017, 10, 29), weuropeStandardTimeTimestamp.DateTime);
Assert.AreEqual(TimeSpan.FromHours(2), weuropeStandardTimeTimestamp.Offset);
var weuropeStandardTimeTimestampNextDay = AddDaysInTimeZone(weuropeStandardTimeTimestamp, 1, timeZoneId);
Assert.AreEqual(new DateTime(2017, 10, 30), weuropeStandardTimeTimestampNextDay);
Assert.AreEqual(TimeSpan.FromHours(1), weuropeStandardTimeTimestamp.Offset);
}
private DateTimeOffset AddDaysInTimeZone(DateTimeOffset timestamp, int days, string timeZoneId)
{
// this line has to be fixed:
return timestamp.AddDays(days);
}
}
}
AddDaysInTimeZone
方法は正しい実装に置き換えなければなりません。
PS無効/不明瞭/スキップされた日付になった場合、例外をスローすると問題ありません。
[mcve]と理想的には、*正確に*を明記してください。 'DateTimeOffset'には問題のタイムゾーンに対して間違いなく有効なオフセットが含まれていますか? 1日追加するとあいまいな時間やスキップされた時間になった場合はどうしますか? (午前1時30分*前に午前2時または午後1時に時計が戻るか前になると思います)。 –
「非Microsoft」以外のライブラリがない場合は、答えが疑わしいはありません:https://docs.microsoft.com/en-us/dotnet/standard/datetime/performing-arithmetic-operations –
@DylanNicholson:私は確かに少量のコードでは 'TimeZoneInfo' 。 (野田時代の方がいいかもしれませんが、それは別の問題です)。しかし、まずは本当に正確な要件が必要です。それ以前に試してみる必要はありません。 –