Как вывести форматированную строку 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"
14 ответов:
там уже есть функция под названием
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'; }; }() ); }
смотрите последний пример на странице 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
почти каждый метод to-ISO в интернете удаляет информацию о часовом поясе, применяя преобразование в"Z" ulu time (UTC) перед выводом строки. Родной браузер .toISOString () также удаляет информацию о часовом поясе.
это отбрасывает ценную информацию, так как сервер или получатель всегда могут конвертировать полную дату ISO в время Zulu или любой другой часовой пояс, который он требует, при этом все еще получая информацию о часовом поясе отправителя.
лучшее решение, которое я пришел через это использовать момент.js библиотека JavaScript, и использовать следующий код:
чтобы получить текущее время 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")
Это может быть объединено с датой.JS, чтобы получить функции, такие как дата.сегодня () чей результат затем может быть передан момент.
строка даты, отформатированная таким образом, является компилятором JSON и хорошо поддается хранению в базе данных. Кажется, Python и C# это нравится.
вопрос был задан в формате ISO С пониженной точности. Вуаля:
new Date().toISOString().slice(0, 19) + 'Z' // '2014-10-23T13:18:06Z'
предполагая, что трейлинг Z требуется, в противном случае просто опустите.
Если вам не нужно поддерживать IE7, следующее-отличный, краткий Хак:
JSON.parse(JSON.stringify(new Date()))
Я обычно не хочу отображать дату 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, но для полноты это то, что я использую:// 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; }
есть ' + ' отсутствует после '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)
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); }
проблема с toISOString заключается в том, что он дает datetime только как "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
Я бы просто использовал это небольшое расширение для
Date
- http://blog.stevenlevithan.com/archives/date-time-formatvar date = new Date(msSinceEpoch); date.format("isoDateTime"); // 2007-06-09T17:46:21
я смог получить ниже вывода с очень меньшим количеством кода.
var ps = new Date('2010-04-02T14:12:07') ; ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";
выход:
Fri Apr 02 2010 19:42 hrs
function getdatetime() { d = new Date(); return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1) .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'--T.Z') .replace(/-(\d)T/,'-0T'); }
Я где-то нашел основы переполнения стека (я считаю, что это было частью какого-то другого кода Stack Exchange), и я улучшил его, чтобы он работал в Internet Explorer 10 или ранее. Это некрасиво, но он выполняет свою работу.
чтобы расширить большой и краткий ответ Шона с некоторым сахаром и современным синтаксисом:
// 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