2016-07-30 3 views
2

я присваивал значение в SQLServer БД в UTC, который 2016-07-28 16:00:00.000:Как скопировать UTC + Offset Date в Local?

enter image description here

Я конвертирован, что UTC DateTime строка в строку ISO в JavaScript, а затем передается это значение в данный момент и называется toDate() в теме.

Но значение выводит по-прежнему UTC, включая смещение.

Так я вышел через результаты двух заданий и обнаружили следующие значения на каждой стадии:

первое назначение: (UTC значение 4:15 вечера формы преобразованы в БД ISOString)

var isoDate = new Date('7/28/2016 4:15:00 PM').toISOString(); 

output value: "2016-07-28T15:15:00.000Z" 

второе задание: (Быть выход как UTC плюс смещение вместо ожидаемого 17:15 местного)

var localOutageStart = moment.utc(isoDate).toDate(); 

output value: Thu Jul 28 2016 16:15:00 GMT+0100 (GMT Daylight Time) 

вместо этого я хотел бы, чтобы выводить значения в локальный, используя смещение, так шо uld выводит это значение вместо этого местным:

desired output value: 28 07 2016 17:15:00 

Как я могу вместо этого вывести локальный момент времени вместо UTC плюс смещение? Я передаю результат Bootstrap datetime picker, который, как я думаю, занимает минутное значение.

+0

Вашего второго примера уже есть местное время, а не время UTC. Это также поможет узнать, ищете ли вы строку, объект «Дата» или объект «момента» в результатах, а также то, что вы используете в локали и часовом поясе. –

+0

'16: 15 'уже пришло время. UTC один - «15: 15». Почему вы хотите еще раз пересчитать 1h? – Oriol

+0

Кроме того, * input * в вашем первом примере уже есть в местном масштабе, так что ... что вы действительно пытаетесь выполнить? вы просто ищете '.local()' в момент объекта? Как и в, '.utc(). Local(). Utc(). Local()' ... вы могли бы сделать это весь день ... :) –

ответ

2

Если 2016-07-28 16:00:00.000 в UTC, тогда вам нужно рассматривать его как таковой. Как ISO8601, он должен быть 2016-07-28T16:00:00.000Z. Вы можете получить это с момента, как так:

var i = "2016-07-28 16:00:00.000"; 
var s = moment.utc(i).toISOString(); 

Или без момента, как так:

var i = "2016-07-28 16:00:00.000"; 
var s = new Date(i + " UTC").toISOString(); // yes, a non-standard hack, but works. 

Это создает строку: "2016-07-28T16:00:00.000Z"

Затем, когда вы хотите использовать его на клиенте сторона:

var i = "2016-07-28T16:00:00.000Z"; 
var m = moment(i); // here's a moment object you can use with your picker 
var d = m.toDate(); // or, if you want a Date object 

// or, if you want to custom format a string 
var s = m.format("DD MM YYYY HH:mm:ss"); 

Или если вы хотите сделать это только с помощью объекта Date:

var i = "2016-07-28T16:00:00.000Z"; 
var d = new Date(i); 

(Но обычай верстка сложнее без моментного)

+2

+1 для критической части браузера, получающего строку без часовой пояс, поэтому ее интерпретируют как находящуюся в локальном часовом поясе. – kwah

+0

Nice Я думаю, что главная причина путаницы здесь - то, что @kwah упомянул, что прошедшая в строке даты сервера не указала часовой пояс. –

+0

Я заметил одну неприятную вещь при форматировании момента, она теряет минутную точность, например, если я прочитал в строке ISO со значением 4:10 PM после вызова .format («MM/DD/YYYY HH: MM») ; минутное значение момента вычитается на 3. Я поставил вопрос здесь, так как не видел подобной проблемы, поднятой раньше - http://stackoverflow.com/questions/38679715/how-to-resolve-loss-of -minute-precision-formatting-a-moment-in-12hr –