14

たとえば、日付と時刻のコントロールを使用して、ユーザーが日付と時刻を選択すると、文字列表現は次のようになります。

"6-25-2012 12:00:00 PM"

このユーザーが EST タイム ゾーンにいる場合があります。文字列はサーバーに渡され、.NET DateTime オブジェクトに変換され、SQL Server の datetime 列に格納されます。

日付が後でブラウザに返されるときは、日付に戻す必要がありますが、上記の文字列が日付に入力されると、4 時間の時間が失われます。これは、JavaScript の日付を作成するときにタイムゾーンを指定しないと、デフォルトで現地時間になり、EST は GMT から -400 であるため、午後 12 時が EST として指定されることを意図していたにもかかわらず、午後 12 時から 4 時間が差し引かれるためだと思います。ユーザーは EST タイム ゾーンのマシンでそれを選択しました。

サーバーに渡して永続化する前に、元の日時文字列に何かを追加する必要があることは明らかです。これを行うための推奨される方法は何ですか?

4

4 に答える 4

21

Date文字列を解析するために JavaScript のコンストラクターに依存しないでください。動作とサポートされる形式は、ブラウザーとロケールによって大きく異なります。 オブジェクトを直接使用した場合のデフォルトの動作の一部を次に示します。Date

文字列から取得する必要がある場合は、ISO8601 などの標準化された形式を使用してみてください。その形式で指定した日付は"2012-06-25T12:00:00". JavaScript でこれらを操作する最も簡単な方法は、moment.jsを使用することです。

また、実際に何を表現しようとしているのかについても注意してください。現在、ローカルの日付/時刻を渡し、ローカル/日付/時刻を保存し、ローカルの日付/時刻を返しています。その過程で、「ローカル」とは何かという考えが変わる可能性があります。

多くの場合、日付/時刻は正確な瞬間を表すことを目的としています。これを機能させるには、クライアントで入力された現地時間から UTC に変換する必要があります。UTC をサーバーに送信し、保存します。後で、UTC を取得してクライアントに送り返し、UTC として処理して現地時間に変換します。これはすべて moment.js を使用して簡単に実行できます。

// I'll assume these are the inputs you have.  Adjust accordingly.
var dateString = "6-25-2012";
var timeString = "12:00:00 PM";

// Construct a moment in the default local time zone, using a specific format.
var m = moment(dateString + " " + timeString, "M-D-YYYY h:mm:ss A");

// Get the value in UTC as an ISO8601 formatted string
var utc = m.toISOString(); // output: "2012-06-25T19:00:00.000Z"

.Net のサーバー上:

var dt = DateTime.Parse("2012-06-25T19:00:00.000Z",   // from the input variable
                        CultureInfo.InvariantCulture, // recommended for ISO
                        DateTimeStyles.RoundtripKind) // honor the Z for UTC kind

それをデータベースに格納します。後でそれを取得して送り返します。

// when you pull it from your database, set it to UTC kind
var dt = DateTime.SpecifyKind((DateTime)reader["yourfield"], DateTimeKind.Utc);

// send it back in ISO format:
var s = dt.ToString("o"); // "o" is the ISO8601 "round-trip" pattern.

moment.js の javascript に戻します。

// construct a moment:
var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server

// display it in this user's local time zone, in whatever format you want
var s = m.format("LLL");   // "June 25 2012 12:00 PM"

// or if you need a Date object
var dt = m.toDate();

ほら、これは簡単で、タイム ゾーンについて特別なことをする必要はありませんでした。

于 2013-08-12T16:55:52.857 に答える
2

JSON.Stringfy()... のせいにして、次のようにします。

x = (your_date);
x.setHours(x.getHours() - x.getTimezoneOffset() / 60);
于 2018-03-15T00:16:52.693 に答える