Как преобразовать короткие даты в этот формат: DDD MMM DD YYYY GMT+0800 (стандартное время X страны)?
Когда я делаю new Date()
Я получил:
Thu Dec 28 2017 10:17:58 GMT+0800 (台北標準時間)
Если я подам заявку .valueOf()
к этой дате я получаю:
1514427724039
Что я и хочу.
Теперь мне нужно подать заявку .valueOf()
на такую дату: 2017/12/28
, Я пытался использовать Luxon для преобразования даты (с момента подачи заявки .valueOf()
до YYYY/MM/DD не выдает число):
DateTime.fromISO(startDate.replace(/\//g, '-')).toRFC2822()
// => Thu, 28 Dec 2017 00:00:00 +0800
Тем не менее, применяя valueOf()
этот результат возвращает ту же строку. Не число, как в первом примере.
Что я должен сделать, чтобы я мог получить числовое значение из YYYY/MM/DD
? Просто я сделал с DDD MMM DD YYYY GMT+0800 (X country standard time)
?
3 ответа
Я думаю, что вы теряете след типов.
fromISO()
возвращает объект Luxon DateTime, но toRFC2822
возвращает строковое представление RFC 2822 даты.
Так что ваши valueOf()
вызывается в строке, а не в DateTime.
Как уже отмечали другие, вам нужно только позвонить valueOf()
на результат fromISO()
,
Проиллюстрировать:
var dt = luxon.DateTime.fromISO('2017-12-05'); // returns a Luxon DateTime object
console.log('fromISO returns an', typeof dt);
var rfc = dt.toRFC2822(); // returns a string
console.log('toRFC2822 returns a', typeof rfc);
var valueOfRFC = rfc.valueOf(); // string.valueOf() is just that string
console.log('strings are their own values?', rfc === valueOfRFC);
var valueOfDT = dt.valueOf(); // this is what you want
console.log('value of datetime', valueOfDT);
<script src="https://moment.github.io/luxon/global/luxon.min.js"></script>
Если вы хотите использовать Luxon, вы можете:
- использование
valueOf()
вместоtoRFC2822()
(как Слай предложил в комментариях) - использование
fromString
удалениеreplace
var startDate = '2017/12/28';
var DateTime = luxon.DateTime;
// fromISO with regex
console.log( DateTime.fromISO(startDate.replace(/\//g, '-')).valueOf() );
// fromString instead of regex
console.log( DateTime.fromString(startDate, 'yyyy/MM/dd').valueOf() );
<script src="https://moment.github.io/luxon/global/luxon.min.js"></script>
Если вы хотите использовать момент ("старший брат" Люксона), вы можете просто использовать moment(String, String)
:
var startDate = '2017/12/28';
console.log( moment(startDate, 'YYYY/MM/DD').valueOf() );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.js"></script>
По умолчанию и люксон, и момент разбирают строку как местное время.
Вы также можете использовать ванильный JavaScript, см. Дата:
new Date(year, month, day)
(Месяц аргумента основан на 0)new Date(dateString)
(Формат, совместимый с IS0 8601, например, 2017-12-28. Не поддерживается в Firefox <=3 и IE <=8)
var startDate = '2017/12/28';
var arr = startDate.split('/');
console.log( new Date(arr[0], arr[1]-1, arr[2]).valueOf() );
console.log( new Date(startDate.replace(/\//g, '-')).valueOf() );
Обратите внимание, что:
Примечание: разбор строк даты с
Date
конструктор (иDate.parse
, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий браузера. Поддержка строк формата RFC2822 предоставляется только по соглашению. Поддержка форматов ISO 8601 отличается тем, что строки, содержащие только дату (например, "1970-01-01"), обрабатываются как UTC, а не как локальные.
Date
Объект будет принимать строку YYYY/MM/DD как есть. Оттуда вы можете использовать .getTime()
чтобы получить метку времени:
var startDate='2017/12/28';
var dateStamp = new Date(startDate); // e.g. "Thu Dec 28 2017 00:00:00 GMT-0600 (Central Standard Time)"
var timeStamp = dateStamp.getTime(); // e.g. 1514440800000