18

かなり単純なアプリケーションに野田時間を使用しようとしていますが、非常に基本的なユースケースを処理するためのドキュメントを見つけるのに苦労しています:

ログインしているユーザーがいて、優先タイムゾーンを設定に保存します。クライアントから送信される日付/時刻は、既知のテキスト形式 (例: "dd/MM/yyyy HH:mm") で、既知のタイム ゾーン ID (例: "Europe/London") が付いています。これらの時刻を UTC/Noda Instants に変換して、各日付のタイム ゾーン情報をデータベースに保存する必要がないようにすることを計画していました。

まず、これは賢明なアプローチのように聞こえますか? 私はほとんど何でも自由に変更できるので、より良い/より賢明なコースに設定できれば幸いです. データベースは、C# ドライバーを使用する MongoDb です。

私が試したことはこれらの線に沿っていますが、最初のステップを乗り越えるのに苦労しています!

var userSubmittedDateTimeString = "2013/05/09 10:45";
var userFormat = "yyyy/MM/dd HH:mm";
var userTimeZone = "Europe/London";

//noda code here to convert to UTC


//Then back again:

私が持っているのは、さまざまな変換の失敗だけです。「野田時間はじめよう」のページを指差していただけると嬉しいです!

4

1 に答える 1

21

これらの時刻をUTC/Noda Instantsに変換して、各日付のすべてのタイムゾーン情報をデータベースに保存する必要がないようにすることを計画していました。

後で元のタイムゾーンを知る必要がない場合は、これで問題ありません。(たとえば、ユーザーがタイムゾーンを変更したが、元のタイムゾーンで何かを繰り返したい場合)。

とにかく、私はこれを3つのステップに分けます。

  • 解析してLocalDateTime
  • それをに変換するZonedDateTime
  • それをに変換するInstant

何かのようなもの:

// TODO: Are you sure it *will* be in the invariant culture? No funky date
// separators?
// Note that if all users have the same pattern, you can make this a private
// static readonly field somewhere
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy/MM/dd HH:mm");

var parseResult = pattern.Parse(userSubmittedDateTimeString);
if (!parseResult.Success)
{
    // throw an exception or whatever you want to do
}

var localDateTime = parseResult.Value;

var timeZone = DateTimeZoneProviders.Tzdb[userTimeZone];

// TODO: Consider how you want to handle ambiguous or "skipped" local date/time
// values. For example, you might want InZoneStrictly, or provide your own custom
// handler to InZone.
var zonedDateTime = localDateTime.InZoneLeniently(timeZone);

var instant = zonedDateTime.ToInstant();
于 2013-03-22T18:30:46.720 に答える