Как преобразовать короткие даты в этот формат: 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/ ММ/ДД не дает числа):

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)?


person alex    schedule 28.12.2017    source источник
comment
вы пробовали с moment.js? Я почти уверен, это поможет вам. Ссылка: momentjs.com/docs   -  person Vikasdeep Singh    schedule 28.12.2017
comment
w3schools.com/jsref/jsref_obj_date.asp   -  person Ken Kin    schedule 28.12.2017
comment
DateTime.fromISO(startDate.replace(/\//g, '-')).valueOf() moment.github.io /luxon/docs/класс/источник/   -  person Slai    schedule 28.12.2017


Ответы (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>

person snickersnack    schedule 29.12.2017

Если вы хотите использовать 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>

Если вы хотите использовать momentjs («старший брат» Luxon), вы можете просто использовать 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>

По умолчанию и luxon, и момент анализируют строку как местное время.


Вы также можете использовать обычный 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() );

Обратите внимание, что:

Примечание: анализ строк даты с помощью конструктора DateDate.parse, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий браузеров. Поддержка строк формата RFC 2822 осуществляется только по соглашению. Поддержка форматов ISO 8601 отличается тем, что строки, содержащие только дату (например, «1970-01-01»), обрабатываются как UTC, а не как локальные.

person VincenzoC    schedule 28.12.2017

Объект Date будет принимать строку ГГГГ/ММ/ДД как есть. Оттуда вы можете использовать .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
person Crayon Violent    schedule 28.12.2017