Я использую datetimepicker.js , и его функция date
возвращает объект moment.js . Он делает это с локальным смещением UTC, а моя исходная дата имеет другое смещение.
Моя исходная дата:
2015-10-01T15:00:00.000Z
Что я показываю в средстве выбора даты и времени ( DD-MM HH:mm
):
01-10 15:00
Что я получаю:
2015-10-01T15:40:00+01:00
Что я хочу:
2015-10-01T15:40:00+00:00
Обратите внимание, как я удалил смещение +01 в конце.
Как я могу сделать это, применяя его для любого локального UTC? Это без необходимости вручную удалять 01 (поскольку это может быть любое другое локальное смещение в зависимости от местоположения пользователя).
Это то, что у меня есть до сих пор, чтобы получить дату, но я не знаю, как удалить смещение, сохранив то же время.
var momentDate = timePicker.data("DateTimePicker").date();
console.log(momentDate.format());
//this prints 2015-10-01T15:40:00+01:00
Поскольку момент будет форматировать исходную дату, чтобы быть датой местного часового пояса. т. е. 2017-08-02 10:00:00+02:00 будет отформатировано как 2017-08-02 16:00:00+08:00, если система машины использует часовой пояс +08:00.
Я написал функцию для форматирования исходной даты без учета часового пояса:
/**
* <strong i="7">@desc</strong> use moment to format a datetime
* <strong i="8">@param</strong> string|date|timestamp datetime: the datetime to format
the given datetime can have timezone, and the timezone will be kept in the process of output datetime
i.e. formate('2017-09-08 11:24:00+08:00', 'D/M/YYYY HH:mm:ss Z') => 8/9/2017 11:24:00 +08:00, as you see, +08:00 is kept, which is different from moment default behavior
if timezone has not been given, local timezone will be used.
* <strong i="9">@param</strong> string formatter: the target format you want to get
* <strong i="10">@param</strong> string givenFormatter: moment allow developer to define your own formatter, i.e. DD/MM/YYYY HH,mm,ss which is not a statndard time format
* <strong i="11">@return</strong> string new formatted datetime string
* <strong i="12">@example</strong>:
1. format(new Date(), 'YYYY-MM-DD HH:mm:ss')
2. format(your_date, 'YYYY-MM-DD HH:mm:ss', 'DD/MM/YYYY HH,mm,ss')
*/
export function format(datetime, formatter, givenFormatter) {
let localTimezoneOffset = timezoneOffset()
let givenTimezoneOffset = moment.parseZone(datetime).utcOffset()
if (givenTimezoneOffset !== 0) {
return moment(datetime, givenFormatter).utcOffset(givenTimezoneOffset).format(formatter)
}
else {
// big problem: we do not know whether timezone has not been given or it is +00:00
// if its utc time is the same with itself, it means timezone has been given
let u = utc(datetime, 'YYYY-MM-DD HH:mm:ss')
let t = moment(datetime).parseZone(datetime).format('YYYY-MM-DD HH:mm:ss')
if (u === t) {
return moment(datetime, givenFormatter).utc().format(formatter)
}
else {
return moment(datetime).format(formatter)
}
}
}
Исходный код: https://github.com/tangshuang/moment-format
Используйте эту функцию, чтобы форматировать дату, игнорируя логику форматирования момента по умолчанию. 2017-08-02 10:00:00+02:00 будет отформатирован как 2017/08/02 10:00:00+02:00.
const tmp = moment(valueAsDate).utc(true)
- это то, что вам нужно, игнорируя часовой пояс
то вы можете использовать, например, как tmp.toISOString()
.
Самый полезный комментарий
const tmp = moment(valueAsDate).utc(true)
- это то, что вам нужно, игнорируя часовой поясто вы можете использовать, например, как
tmp.toISOString()
.