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();
ほら、これは簡単で、タイム ゾーンについて特別なことをする必要はありませんでした。