Ответ 1
Не используйте конструктор JavaScript Date
для синтаксического анализа строки. Поведение и поддерживаемые форматы сильно различаются для каждого браузера и локали. Здесь - это лишь некоторые из вариантов поведения по умолчанию, если вы напрямую используете объект 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.
Передайте его обратно в javascript в moment.js:
// construct a moment:
var m = moment("2012-06-25T19:00:00.000Z"); // use the value from the server
// display it in this user 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();
Смотрите - это было легко, и вам не нужно было вовлекаться в часовые пояса.