Как отформатировать дату UTC в виде строки `ГГГГ-ММ-ДД чч: мм: сс` с помощью NodeJS?


242

Используя NodeJS, я хочу отформатировать Dateв следующий формат строки:

var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");

Как я могу это сделать?


4
Отчасти надоело обходиться без каких-либо библиотек. Я рекомендую использовать datejs
Питер Олсон


или Tempus
Дэн Д.

Темпус работал отлично. Рекламные проблемы будут моментом.
Тампа

1
Ни Datejs, ни Tempus не являются библиотеками Node (хотя их можно использовать с Node, вы не можете использовать установщик библиотеки npm). Поскольку никто не назвал их реальными ответами, я сделал это сам.
Джулиан Найт

Ответы:


532

Если вы используете Node.js, вы обязательно используете EcmaScript 5, поэтому у Date есть toISOStringметод. Вы просите небольшую модификацию ISO8601:

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'

Так что просто отрежьте несколько вещей, и все готово:

new Date().toISOString().
  replace(/T/, ' ').      // replace T with a space
  replace(/\..+/, '')     // delete the dot and everything after
> '2012-11-04 14:55:45'

Или в одну строку: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 обязательно является UTC (также обозначается завершающим Z в первом результате), поэтому вы получите UTC по умолчанию (всегда хорошо).


4
Умное и простое решение, которое позволяет избежать использования библиотек - приятно!
Wingman4l7

11
Если вы получили ошибку, Object has no method 'toISOString'вы пропустилиnew
allenhwkim

29
Стоит отметить, что использование регулярных выражений таким способом является медленным, и они вам здесь даже не нужны, это: new Date().toISOString().replace('T', ' ').substr(0, 19)работает просто отлично.
Killah

2
Обратите внимание, что, удаляя часовой пояс, он теперь представляет разные моменты времени в каждом часовом поясе с другим смещением.
RobG

1
@RobG Вы можете сказать это о любом представлении даты и времени, которое не имеет явного часового пояса.
Фил

105

ОБНОВЛЕНИЕ 2017-03-29: Добавлены date-fns, некоторые заметки по Moment и Datejs
ОБНОВЛЕНИЕ 2016-09-14: Добавлен SugarJS, который, кажется, имеет отличные функции даты / времени.


Хорошо, так как никто не дал фактического ответа, вот мой.

Библиотека, безусловно, является лучшим выбором для обработки дат и времени стандартным способом. В вычислениях даты / времени существует множество граничных случаев, поэтому полезно иметь возможность передать разработку в библиотеку.

Вот список основных Node-совместимых библиотек форматирования времени:

  • Moment.js [ благодаря Mustafa ] «Легкая (4.3k) библиотека JavaScript-дат для анализа, обработки и форматирования дат» - включает в себя интернационализацию, вычисления и относительные форматы дат - Обновление 2017-03-29 : Не совсем так легко больше, но все же самое комплексное решение, особенно если вам нужна поддержка часового пояса.
  • date-fns [ добавлено 2017-03-29, спасибо Fractalf ] Небольшой, быстрый, работает со стандартными объектами даты JS. Отличная альтернатива Moment, если вам не нужна поддержка часовых поясов.
  • SugarJS - общая вспомогательная библиотека, добавляющая столь необходимые функции во встроенные типы объектов JavaScripts. Включает в себя некоторые отличные возможности даты / времени.
  • STRFTIME - просто и красиво, просто и красиво
  • dateutil - это тот, который я использовал до MomentJS
  • Узел-FormatDate
  • Путешественник во времени - «Time Traveler предоставляет набор служебных методов для работы с датами. От сложения и вычитания до форматирования. Time Traveler расширяет только созданные им объекты даты, не загрязняя глобальное пространство имен».
  • Tempus [благодаря Dan D] - ОБНОВЛЕНИЕ: это также можно использовать с Node и развертывать с помощью npm, см. Документацию

Есть также не-Node библиотеки:

  • Datejs [спасибо Питер Олсон] - не упакованные в НОМ или GitHub поэтому не так легко для использования с узлом - на самом деле не рекомендуется , так как не обновляются с 2007 года!

2
Это также очень актуально date-fns.org ( github.com/date-fns/date-fns )
Fractalf 12.12.16

У людей, стоящих за Моментом, есть эксперимент под названием Luxon, по состоянию на февраль 2018 г. moment.github.io/luxon/index.html
alxndr,

Спасибо @alxndr, похоже на полезную перезагрузку.
Джулиан Найт

Момент + toISOString () в RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Шейн,


45

Я ничего не имею против библиотек вообще. В этом случае библиотека общего назначения кажется излишней, если только другие части процесса приложения не имеют большой даты.

Написание небольших вспомогательных функций, таких как это, также является полезным упражнением как для начинающих, так и для опытных программистов, и может быть опытом обучения для новичков среди нас.

function dateFormat (date, fstr, utc) {
  utc = utc ? 'getUTC' : 'get';
  return fstr.replace (/%[YmdHMS]/g, function (m) {
    switch (m) {
    case '%Y': return date[utc + 'FullYear'] (); // no leading zeros required
    case '%m': m = 1 + date[utc + 'Month'] (); break;
    case '%d': m = date[utc + 'Date'] (); break;
    case '%H': m = date[utc + 'Hours'] (); break;
    case '%M': m = date[utc + 'Minutes'] (); break;
    case '%S': m = date[utc + 'Seconds'] (); break;
    default: return m.slice (1); // unknown code, remove %
    }
    // add leading zero if required
    return ('0' + m).slice (-2);
  });
}

/* dateFormat (new Date (), "%Y-%m-%d %H:%M:%S", true) returns 
   "2012-05-18 05:37:21"  */

25
Хотя это действительно может быть полезно для обучения, я бы не согласился с тем, что это лучший результат, чем использование небольшой, хорошо сконструированной библиотеки. Библиотека будет поддерживаться и с большей вероятностью будет охватывать крайние случаи в дизайне, которые могут быть не очевидны для вас на первый взгляд, но могут легко укусить в какой-то момент - вычисления даты / времени особенно подвержены этим проблемам из-за присущей им сложности.
Джулиан Найт

8
Это очень хорошее использование метода String.replace (), +1 для творчества
JamieJag

5
Нет. В этом случае обязательно используйте библиотеку. Формат может измениться. Даже если это не изменится, это усложнит код. Другие люди, обслуживающие ваш код, должны будут потратить время, пытаясь понять эту функцию и убедившись, что она правильная. Упражнения для школы; вопрос был о реальном использовании. Если, конечно, это не ваш первый или второй «настоящий» проект; тогда может быть хорошо сделать что-то подобное, чтобы вы могли понять, почему вы не должны делать это в будущем.
osa

3
Я ценю общее чувство использования библиотек в качестве проверенного / закаленного кода, но они также могут добавить сложность развертывания. Этот код делегирует все связанные с календарем тонкости базовому объекту Date и просто вызывает, например, метод getUTCDate () в соответствующем месте. Кроме того, если кто-то найдет ошибку в этом коде, он может сообщить об этом здесь на stackoverflow.com, по сути, совпадая с аспектом много-глаз / мелкие ошибки любой другой библиотеки. +1
пароход25

11

Легко читаемый и настраиваемый способ получения метки времени в нужном формате без использования какой-либо библиотеки:

function timestamp(){
  function pad(n) {return n<10 ? "0"+n : n}
  d=new Date()
  dash="-"
  colon=":"
  return d.getFullYear()+dash+
  pad(d.getMonth()+1)+dash+
  pad(d.getDate())+" "+
  pad(d.getHours())+colon+
  pad(d.getMinutes())+colon+
  pad(d.getSeconds())
}

(Если вам требуется время в формате UTC, просто измените вызовы функций. Например, «getMonth» становится «getUTCMonth»)


9

Библиотека javascript sugar.js ( http://sugarjs.com/ ) имеет функции для форматирования дат

Пример:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')

3
Похоже, действительно потрясающая библиотека. Их форматирование довольно приятное, и их документы показывают элегантные решения для сотен других вещей, которые меня разочаровали в JavaScript. Собираюсь попробовать.
eimajenthat

6

Используйте метод, предоставленный в объекте Date, следующим образом:

var ts_hms = new Date();

console.log(
    ts_hms.getFullYear() + '-' + 
    ("0" + (ts_hms.getMonth() + 1)).slice(-2) + '-' + 
    ("0" + (ts_hms.getDate())).slice(-2) + ' ' +
    ("0" + ts_hms.getHours()).slice(-2) + ':' +
    ("0" + ts_hms.getMinutes()).slice(-2) + ':' +
    ("0" + ts_hms.getSeconds()).slice(-2));

Это выглядит очень грязно, но оно должно хорошо работать с основными методами JavaScript


2
Я согласен, что вам нужно добавить 1 в getMonth (), поскольку январь возвращается как 0, но я не думаю, что вы хотите добавить 1 в getDate ().
Стив Онорато

5

Я использую dateformat в Nodejs и angularjs, так хорошо

устанавливать

$ npm install dateformat
$ dateformat --help

демонстрация

var dateFormat = require('dateformat');
var now = new Date();

// Basic usage
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");
// Saturday, June 9th, 2007, 5:46:21 PM

// You can use one of several named masks
dateFormat(now, "isoDateTime");
// 2007-06-09T17:46:21

// ...Or add your own
dateFormat.masks.hammerTime = 'HH:MM! "Can\'t touch this!"';
dateFormat(now, "hammerTime");
// 17:46! Can't touch this!

// You can also provide the date as a string
dateFormat("Jun 9 2007", "fullDate");
// Saturday, June 9, 2007
...

3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00

Добро пожаловать в StackOverflow. Пожалуйста, отредактируйте свой ответ, иначе вас могут опровергнуть. Как и сейчас, это просто предложение без контекста. Пожалуйста, смотрите здесь, как написать хороший ответ .
Jacefarm

Это происходит с de-locale (отсюда и toLocaleString):3.2.2015, 15:30:00
alwe

2

Альтернатива № 6233 ....

Добавьте смещение UTC к местному времени, затем преобразуйте его в нужный формат с помощью toLocaleDateString()метода Dateобъекта:

// Using the current date/time
let now_local = new Date();
let now_utc = new Date();

// Adding the UTC offset to create the UTC date/time
now_utc.setMinutes(now_utc.getMinutes() + now_utc.getTimezoneOffset())

// Specify the format you want
let date_format = {};
date_format.year = 'numeric';
date_format.month = 'numeric';
date_format.day = '2-digit';
date_format.hour = 'numeric';
date_format.minute = 'numeric';
date_format.second = 'numeric';

// Printing the date/time in UTC then local format
console.log('Date in UTC: ', now_utc.toLocaleDateString('us-EN', date_format));
console.log('Date in LOC: ', now_local.toLocaleDateString('us-EN', date_format));

Я создаю объект даты по умолчанию по местному времени. Я добавляю смещение UTC к нему. Я создаю объект форматирования даты. Я показываю дату / время UTC в желаемом формате:

введите описание изображения здесь


1

Используйте x-dateмодуль, который является одним из подмодулей библиотеки x-class ;

require('x-date') ; 
  //---
 new Date().format('yyyy-mm-dd HH:MM:ss')
  //'2016-07-17 18:12:37'
 new Date().format('ddd , yyyy-mm-dd HH:MM:ss')
  // 'Sun , 2016-07-17 18:12:51'
 new Date().format('dddd , yyyy-mm-dd HH:MM:ss')
 //'Sunday , 2016-07-17 18:12:58'
 new Date().format('dddd ddSS of mmm , yy')
  // 'Sunday 17thth +0300f Jul , 16'
 new Date().format('dddd ddS  mmm , yy')
 //'Sunday 17th  Jul , 16'

1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

с .toString (), это становится в формате

заменить (/ T /, ''). // заменить T на '' 2017-01-15T ...

заменить (/..+/, '') // на ... 13: 50: 16.1271

Например, см. var dateи hour:

var date="2017-01-15T13:50:16.1271".toString("yyyyMMddHHmmss").
                    replace(/T/, ' ').      
                    replace(/\..+/, '');
    
                    var auxCopia=date.split(" ");
                    date=auxCopia[0];
                    var hour=auxCopia[1];

console.log(date);
console.log(hour);


1
Можете ли вы дать какое-то объяснение в контексте контекста вашего ответа?
T-Heron

Добро пожаловать в StackOverflow. Пожалуйста, отредактируйте свой ответ, иначе вас могут опровергнуть. Как и сейчас, это просто предложение без контекста. Пожалуйста, смотрите здесь, как написать хороший ответ .
Jacefarm

@ user7396942 - теперь проголосовали за добавление контекста / объяснения в ваш ответ. Отказ от ответственности: я не был тем, кто ранее проголосовал против, так как сейчас он выглядит гораздо лучше.
T-Heron

3
Почему то .toString("yyyyMMddHHmmss")?
Арджан

1

Для форматирования даты наиболее простым способом является использование момента lib. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')

Спасибо, @ Jazeb_007, это работает для меня, даже если мне не нужно, toISOString()иtoUTCString()
Баблу Ахмед


0
appHelper.validateDates = function (start, end) {
    var returnval = false;

    var fd = new Date(start);
    var fdms = fd.getTime();
    var ed = new Date(end);
    var edms = ed.getTime();
    var cd = new Date();
    var cdms = cd.getTime();

    if (fdms >= edms) {
        returnval = false;
        console.log("step 1");
    }
    else if (cdms >= edms) {
        returnval = false;
        console.log("step 2");
    }
    else {
        returnval = true;
        console.log("step 3");
    }
    console.log("vall", returnval)
    return returnval;
}

0

Проверьте код ниже и ссылку на MDN

// var ts_hms = new Date(UTC);
// ts_hms.format("%Y-%m-%d %H:%M:%S")

// exact format
console.log(new Date().toISOString().replace('T', ' ').substring(0, 19))

// other formats
console.log(new Date().toUTCString())
console.log(new Date().toLocaleString('en-US'))
console.log(new Date().toString())


-1

Я думаю, что это на самом деле отвечает на ваш вопрос.

Так раздражает работа с датой / временем в javascript. После нескольких седых волос я поняла, что это было довольно просто.

var date = new Date();
var year = date.getUTCFullYear();
var month = date.getUTCMonth();
var day = date.getUTCDate();
var hours = date.getUTCHours();
var min = date.getUTCMinutes();
var sec = date.getUTCSeconds();

var ampm = hours >= 12 ? 'pm' : 'am';
hours = ((hours + 11) % 12 + 1);//for 12 hour format

var str = month + "/" + day + "/" + year + " " + hours + ":" + min + ":" + sec + " " + ampm;
var now_utc =  Date.UTC(str);

Вот скрипка


Вам нужно добавить 1 к месяцу, который начинается с нуля.
Мистик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.