2013-04-22 2 views
1

У меня есть следующее datetime, сохраненное в базе данных SQL Server 2005: 2012-12-06 16:20:11.010.Целочисленное число Javascript для datetime с определенным часовым поясом

Я хочу, чтобы отобразить эту DateTime с помощью JavaScript на стороне клиента, так что я сериализовать его (как часть более крупного объекта) с помощью System.Web.Helpers.Json.Encode, который работает следующий код:

internal static readonly long DatetimeMinTimeTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks; 

private static void SerializeDateTime(DateTime datetime, StringBuilder sb, JavaScriptSerializer.SerializationFormat serializationFormat) 
{ 
    if (serializationFormat == JavaScriptSerializer.SerializationFormat.JSON) 
    { 
     sb.Append("\"\\/Date("); 
     sb.Append((datetime.ToUniversalTime().Ticks - JavaScriptSerializer.DatetimeMinTimeTicks)/10000L); 
     sb.Append(")\\/\""); 
     return; 
    } 
    sb.Append("new Date("); 
    sb.Append((datetime.ToUniversalTime().Ticks - JavaScriptSerializer.DatetimeMinTimeTicks)/10000L); 
    sb.Append(")"); 
} 

На стороне клиента, преобразовать его в объект даты и времени, как так: (JSFiddle)

var strDate = "/Date(1354828811010)/"; //value returned by above function 
var re = /-?\d+/; 
var m = re.exec(strDate);    
var date = new Date(parseInt(m[0])); 

на ПК с часовым поясом, установленным в Восточном стандарте, на этот раз правильно отображается в Thu Dec 06 2012 16:20:11 GMT-0500 (Eastern Standard Time). Однако на ПК с часовым поясом в качестве GMT-6 он возвращается как Thu Dec 06 2012 15:20:11 GMT-0600 (Central Standard Time).

На этот раз как Thu Dec 06 2012 16:20:11 GMT-0600 (Central Standard Time), но я не уверен, как наилучшим образом отображать его правильно. Мне не нужно отображать часовой пояс, мне просто нужно показать его как 16:20:11, независимо от настроек локального часового пояса пользователя.

Есть ли механизм в javascript, позволяющий мне ввести дату в определенный часовой пояс? Исследование, которое я сделал на нем, предполагает, что нет.

В противном случае, если мне нужно сделать сервер смены изменений, что мне лучше делать?

+0

Я думаю, вы имеете в виду [toLocaleString] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toLocaleString) – V4Vendetta

ответ

2

Я считаю, что вы ищете связано с тем, что является описанный в Moment.js issue 611. Если да, добавьте ли вы свои отзывы к этой проблеме? Это, безусловно, шоу-шоппер для меня.

BTW - Я также посмотрел DateJS и XDate, и насколько я могу судить, ни одна из них не имеет этой функции. JavaScript кажется заблокирован в UTC или в локальном часовом поясе браузера.

Кроме того, Moment.js уже обрабатывает формат даты Microsoft, который генерирует JavaScriptSerializer, поэтому вы можете использовать его напрямую. Тем не менее, я бы настоятельно рекомендовал вместо этого использовать JSON.Net. Даже Microsoft использует это сейчас. Он по умолчанию возвращает даты в формате ISO.

+0

Да, это похоже на мою проблему. То, что я закончил делать (пока), просто преобразует время на серверную сторону UTC, таким образом, по крайней мере, правильное время всегда будет отображаться локально в зависимости от локального часового пояса пользователя. Это не совсем то, что я хотел, но это подходящее решение.Я буду следить за этой проблемой - это может быть полезно в следующий раз. Спасибо за предложение библиотеки, я не собираюсь реорганизовывать свой текущий проект, но у меня есть новый, я обязательно попробую JSON.Net! – Mansfield

+1

FYI - [MomentJS 2.1.0] (http://momentjs.com/) был недавно выпущен вместе с аддоном момента времени. Вы должны взглянуть еще раз. :) –

1

Взгляните на Moments.js, это один из нескольких библиотек дат javascript, которые могут помочь вам с вашими требованиями к дате/времени.

другие включают datejs и Xdate

0

DateTime.ToUniversalTime() будут включать часовой пояс в сериализованном значении и Javascript будет читать его. Если вы не хотите, чтобы это произошло, не сериализуйте его с помощью часового пояса. Просто используйте метод DateTime.ToString() и дать ему простой формат строки, как:

datetime.toString("o"); 

, которые будут выводить что-то вроде

2008-06-15T21:15:07.0000000 
+0

Это не мой код, вот что такое 'System.Web .Helpers.Json.Encode' делает. – Mansfield

Смежные вопросы