Как вывести строку в формате ISO 8601 в JavaScript?
У меня есть объект Date
. Как отредактировать часть title
следующего фрагмента?
<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>
У меня есть часть "относительное время в словах" из другой библиотеки.
Я пробовал следующее:
function isoDate(msSinceEpoch) {
var d = new Date(msSinceEpoch);
return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
}
Но это дает мне:
"2010-4-2T3:19"
Ответы
Ответ 1
Существует уже функция toISOString()
:
var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"
Если вы каким-то образом находитесь на в браузере, который не поддерживает его, я вас охватил:
if ( !Date.prototype.toISOString ) {
( function() {
function pad(number) {
var r = String(number);
if ( r.length === 1 ) {
r = '0' + r;
}
return r;
}
Date.prototype.toISOString = function() {
return this.getUTCFullYear()
+ '-' + pad( this.getUTCMonth() + 1 )
+ '-' + pad( this.getUTCDate() )
+ 'T' + pad( this.getUTCHours() )
+ ':' + pad( this.getUTCMinutes() )
+ ':' + pad( this.getUTCSeconds() )
+ '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
+ 'Z';
};
}() );
}
Ответ 2
См. последний пример на странице https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date:
/* Use a function for the exact format desired... */
function ISODateString(d) {
function pad(n) {return n<10 ? '0'+n : n}
return d.getUTCFullYear()+'-'
+ pad(d.getUTCMonth()+1)+'-'
+ pad(d.getUTCDate())+'T'
+ pad(d.getUTCHours())+':'
+ pad(d.getUTCMinutes())+':'
+ pad(d.getUTCSeconds())+'Z'
}
var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z
Ответ 3
Почти каждый метод ISO в Интернете отбрасывает информацию о часовом поясе, применяя преобразование к времени UL UL (UTC) до вывода строки. Браузер native.toISOString() также передает информацию о часовом поясе.
Это отбрасывает ценную информацию, так как сервер или получатель всегда может преобразовать полную дату ISO в Zulu time или в зависимости от того, какой временной интервал он требует, в то же время получая информацию о часовом поясе отправителя.
Лучшее решение, с которым я столкнулся, - использовать библиотеку javascript Moment.js и использовать следующие код:
Чтобы получить текущее время ISO с информацией о часовом поясе и миллисекундами
now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"
now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"
now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString()
Чтобы получить время ISO собственного объекта даты JavaScript с информацией о часовом поясе, но без миллисекунд
var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")
Это может быть объединено с Date.js для получения таких функций, как Date.today(), результат которых затем может быть передан в момент.
Строка даты, отформатированная таким образом, является компилятором JSON, и позволяет хорошо хранить в базе данных. Python и С#, похоже, нравится.
Ответ 4
Вопрос был задан в формате ISO с пониженной точностью. Вуаля:
new Date().toISOString().slice(0, 19) + 'Z'
// '2014-10-23T13:18:06Z'
Предполагая, что конечный Z нужен, иначе просто опустите.
Ответ 5
Если вам не нужна поддержка IE7, это отличный, сжатый взлом:
JSON.parse(JSON.stringify(new Date()))
Ответ 6
Самый короткий, но не поддерживаемый Internet Explorer 8 и ранее:
new Date().toJSON()
Ответ 7
Обычно я не хочу показывать дату UTC, так как клиентам не нравится делать конверсию в их голове. Чтобы отобразить локальную дату ISO, я использую функцию:
function toLocalIsoString(date, includeSeconds) {
function pad(n) { return n < 10 ? '0' + n : n }
var localIsoString = date.getFullYear() + '-'
+ pad(date.getMonth() + 1) + '-'
+ pad(date.getDate()) + 'T'
+ pad(date.getHours()) + ':'
+ pad(date.getMinutes()) + ':'
+ pad(date.getSeconds());
if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
return localIsoString;
};
Вышеуказанная функция исключает информацию о смещении часового пояса (за исключением случаев, когда местное время имеет UTC), поэтому я использую функцию ниже, чтобы показать локальное смещение в одном месте. Вы также можете добавить свой результат к результатам вышеуказанной функции, если вы хотите показать смещение в каждом случае:
function getOffsetFromUTC() {
var offset = new Date().getTimezoneOffset();
return ((offset < 0 ? '+' : '-')
+ pad(Math.abs(offset / 60), 2)
+ ':'
+ pad(Math.abs(offset % 60), 2))
};
toLocalIsoString
использует pad
. При необходимости он работает почти как любая функция пэда, но ради полноты я использую:
// Pad a number to length using padChar
function pad(number, length, padChar) {
if (typeof length === 'undefined') length = 2;
if (typeof padChar === 'undefined') padChar = '0';
var str = "" + number;
while (str.length < length) {
str = padChar + str;
}
return str;
}
Ответ 8
После "T"
отсутствует "+",
isoDate: function(msSinceEpoch) {
var d = new Date(msSinceEpoch);
return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T'
+ d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
}
должен это сделать.
Для ведущих нулей вы можете использовать это из здесь:
function PadDigits(n, totalDigits)
{
n = n.toString();
var pd = '';
if (totalDigits > n.length)
{
for (i=0; i < (totalDigits-n.length); i++)
{
pd += '0';
}
}
return pd + n.toString();
}
Используя его следующим образом:
PadDigits(d.getUTCHours(),2)
Ответ 9
function timeStr(d) {
return ''+
d.getFullYear()+
('0'+(d.getMonth()+1)).slice(-2)+
('0'+d.getDate()).slice(-2)+
('0'+d.getHours()).slice(-2)+
('0'+d.getMinutes()).slice(-2)+
('0'+d.getSeconds()).slice(-2);
}
Ответ 10
Проблема с toISOString заключается в том, что она дает дату и время только как "Z".
ISO-8601 также определяет дату и время с разницей часового пояса в часах и минутах в формах, таких как 2016-07-16T19: 20: 30 + 5: 30 (когда часовой пояс впереди UTC) и 2016-07-16T19: 20: 30-01: 00 (когда часовой пояс находится за UTC).
Я не думаю, что неплохо использовать другой плагин, момент .js для такой небольшой задачи, особенно когда вы можете получить его с несколькими строками кода.
var timezone_offset_min = new Date().getTimezoneOffset(),
offset_hrs = parseInt(Math.abs(timezone_offset_min/60)),
offset_min = Math.abs(timezone_offset_min%60),
timezone_standard;
if(offset_hrs < 10)
offset_hrs = '0' + offset_hrs;
if(offset_min > 10)
offset_min = '0' + offset_min;
// getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa.
// So add an opposite sign to the offset
// If offset is 0, it means timezone is UTC
if(timezone_offset_min < 0)
timezone_standard = '+' + offset_hrs + ':' + offset_min;
else if(timezone_offset_min > 0)
timezone_standard = '-' + offset_hrs + ':' + offset_min;
else if(timezone_offset_min == 0)
timezone_standard = 'Z';
// Timezone difference in hours and minutes
// String such as +5:30 or -6:00 or Z
console.log(timezone_standard);
Как только у вас есть смещение часового пояса в часах и минутах, вы можете добавить к строке datetime.
Я написал сообщение в блоге: http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes
Ответ 11
Я просто использовал бы это небольшое расширение для Date
- http://blog.stevenlevithan.com/archives/date-time-format
var date = new Date(msSinceEpoch);
date.format("isoDateTime"); // 2007-06-09T17:46:21
Ответ 12
Я смог получить ниже выход с очень низким кодом.
var ps = new Date('2010-04-02T14:12:07') ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";
Вывод:
Fri Apr 02 2010 19:42 hrs
Ответ 13
function getdatetime() {
d = new Date();
return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1)
.replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z')
.replace(/-(\d)T/,'-0$1T');
}
Я нашел основы для Qaru где-то (я считаю, что это было частью какого-то другого Stack игры в гольф для кодов), и я улучшил его, так что он работает в Internet Explorer 10 или ранее. Это уродливо, но он выполняет свою работу.
Ответ 14
Чтобы расширить Шон большой и лаконичный ответ с сахаром и современным синтаксисом:
// date.js
const getMonthName = (num) => {
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
return months[num];
};
const formatDate = (d) => {
const date = new Date(d);
const year = date.getFullYear();
const month = getMonthName(date.getMonth());
const day = ('0' + date.getDate()).slice(-2);
const hour = ('0' + date.getHours()).slice(-2);
const minutes = ('0' + date.getMinutes()).slice(-2);
return '${year} ${month} ${day}, ${hour}:${minutes}';
};
module.exports = formatDate;
Тогда, например.
import formatDate = require('./date');
const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
console.log(formatDate(myDate)); // 2018 Jul 24, 13:44