これが単純な質問のように思われる場合はお詫びしますが、私が持っている解決策がすべての場合に最も賢明であるかどうかを確認したいだけです。
使用する既存のSQLServerデータベースには、「期間」が包括的開始->包括的終了UTCDateTime値として格納されます。(開始列と終了列はどちらもdatetime2(7)
、作業を開始する前にSystem.DateTime
インスタンスに自動的に変換されますDateTimeKind.UTC
)。
したがって、「ユーザーのタイムゾーンを指定して、1日/月/年全体」を保存する必要がある場合は、「特定のDateTimeZoneで指定されたLocalDateの最後の可能な瞬間」を見つける必要があります。
私が持っている方法は次のとおりです。
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(Duration.FromTicks(-1));
}
23:59:59.9999999が「スキップ」され、ターゲットに存在しない場合、次の利用可能なインスタントにマップされるため、LocalDateTime
を使用し.AtLeniently(..)
て「日付の終わり」を(他の場所で)マッピングすることも避ける必要があると思います。DateTimeZone
ギャップ00:00:00.000000の「外側」側。これにより、排他的な ZonedDateTime
値が得られます。
修正された方法:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
// TODO: Replace with localDate.At(LocalTime.MaxValue) when NodaTime 2.0 is released.
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(-Duration.Epsilon);
}
public static ZonedDateTime AtEndOfDayInZone(this LocalDate localDate, DateTimeZone zone)
{
return zone.AtEndOfDay(localDate);
}
まず、コメントに記載されているように、排他的な上限で作業できるときはいつでも、それは良い考えです:)
の代わりにAtEndOfDay
使用することを除いて、あなたの方法は私には合理的に見えます。特に、Noda Time 2.0では、ティックではなくナノ秒の精度に移行します。どちらの場合もあなたが望むことをします。Duration.Epsilon
Duration.FromTicks
Duration.Epsilon
あなたのLocalDate
解決策では、表現可能な最大の値LocalTime.MaxValue
(またはEndOfDay
)が欠落しているように思われますLocalTime
。それが利用可能であれば、次のように書くことができます。
return date.At(LocalTime.MaxValue);
これにより、以前と同じ「ティック」の問題が解消されます。2.0用にそれを追加することを忘れないようにします-「レガシーシステムによって強制された場合にのみこれを使用する」という効果へのコメントで文書化されますが:)
1日を加算してからティック(またはナノ秒)を減算することの1つの欠点は、で失敗することLocalDate.MaxValue
です。これはおそらく実用的な問題ではありませんが、Noda Time自体のコードでは、そのようなことは避けようとしています。ZonedDateTime
それはかなり複雑なシナリオなので、私はバージョンではそれを避けようとはしません。(おそらくそれを行う方法はありますが、それだけの価値はありません。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加