Javascript toISOString() игнорирует смещение часового пояса
Я пытаюсь преобразовать datetime Twitter в локальную iso-строку (для prettyDate) сейчас в течение 2 дней. Я просто не получаю местное время.
im, используя следующую функцию:
function getLocalISOTime(twDate) {
var d = new Date(twDate);
var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
d.getMinutes(), d.getSeconds(), d.getMilliseconds());
// obtain local UTC offset and convert to msec
localOffset = d.getTimezoneOffset() * 60000;
var newdate = new Date(utcd + localOffset);
return newdate.toISOString().replace(".000", "");
}
в newdate все нормально, но toISOString() снова возвращает его в исходное время...
Может кто-нибудь помочь мне получить местное время в iso из Twitterdate в формате:
Чт, 31 мая 2012 г. 08:33:41 +0000
Ответы
Ответ 1
moment.js
отлично, но иногда вы не хотите тянуть большое количество зависимостей для простых вещей.
Также работает следующее:
var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
// => '2015-01-26T06:40:36.181'
slice(0, -1)
избавляется от конечного Z
, который представляет часовой пояс Zulu и может быть заменен вашим собственным.
Ответ 2
Мое решение без использования моментов - это преобразовать его в метку времени, добавить смещение временной зоны, затем преобразовать обратно в объект даты, а затем запустить toISOString()
var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
Ответ 3
moment.js FTW !!!
Просто конвертируйте свою дату в момент и манипулируйте ею, как вам угодно:
var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00
http://momentjs.com/docs/
Ответ 4
Эта функция даты ниже обеспечивает желаемый эффект без дополнительной библиотеки script. В основном это просто простая конкатенация компонентов даты в правильном формате и добавление прототипа объекта Date.
Date.prototype.dateToISO8601String = function() {
var padDigits = function padDigits(number, digits) {
return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}
var offsetMinutes = this.getTimezoneOffset();
var offsetHours = offsetMinutes / 60;
var offset= "Z";
if (offsetHours < 0)
offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
else if (offsetHours > 0)
offset = "+" + padDigits(offsetHours + "00", 4);
return this.getFullYear()
+ "-" + padDigits((this.getUTCMonth()+1),2)
+ "-" + padDigits(this.getUTCDate(),2)
+ "T"
+ padDigits(this.getUTCHours(),2)
+ ":" + padDigits(this.getUTCMinutes(),2)
+ ":" + padDigits(this.getUTCSeconds(),2)
+ "." + padDigits(this.getUTCMilliseconds(),2)
+ offset;
}
Date.dateFromISO8601 = function(isoDateString) {
var parts = isoDateString.match(/\d+/g);
var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
var isoDate = new Date(isoTime);
return isoDate;
}
function test() {
var dIn = new Date();
var isoDateString = dIn.dateToISO8601String();
var dOut = Date.dateFromISO8601(isoDateString);
var dInStr = dIn.toUTCString();
var dOutStr = dOut.toUTCString();
console.log("Dates are equal: " + (dInStr == dOutStr));
}
Использование:
var d = new Date();
console.log(d.dateToISO8601String());
Надеюсь, это поможет кому-то другому.
ИЗМЕНИТЬ
Исправлена ошибка UTC, упомянутая в комментариях, и кредит Alex для функции dateFromISO8601
.
Ответ 5
Используя moment.js
, вы можете использовать параметр keepOffset
в toISOString
:
toISOString(keepOffset?: boolean): string;
moment().toISOString(true)
Ответ 6
date = new Date();
date.setMinutes( -this.date.getTimezoneOffset() );
Ответ 7
Моментом решения JS это
var d = new Date(new Date().setHours(0,0,0,0));
m.add(m.utcOffset(), 'm')
m.toDate().toISOString()
// output "2019-07-18T00:00:00.000Z"
Ответ 8
Будет очень полезно узнать текущую дату и время.
var date=new Date();
var today=new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().replace(/T/, ' ').replace(/\..+/, '');