Як відформатувати дату UTC як рядок `YYYY-MM-DD hh: mm: ss` за допомогою NodeJS?


242

За допомогою NodeJS я хочу відформатувати формат Dateу такий рядок:

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

Як це зробити?


4
Неприємно обійтися без бібліотек. Рекомендую використовувати datejs
Пітер Олсон



Темпус працював чудово. Проблеми з рекламою будуть моменти.
Тампа

1
Ні Datejs, ні Tempus не є бібліотеками вузлів (хоча вони можуть бути використані з 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
помилитесь

29
Одне, що слід зазначити, це те, що використовувати регулярні вирази таким чином повільно, і вони вам навіть тут не потрібні, це: new Date().toISOString().replace('T', ' ').substr(0, 19)працює чудово.
Кілла

2
Зауважте, що, видаляючи часовий пояс, він тепер представляє різний момент у кожному часовому поясі з різним зміщенням.
RobG

1
@RobG Ви можете сказати, що про будь-яке подання часу, яке не має чіткого часового поясу.
Філ

105

ОНОВЛЕННЯ 2017-03-29: Додано дати-fns, деякі нотатки про Момент і Датас
ОНОВЛЕННЯ 2016-09-14: Додано SugarJS, який, здається, має чудові функції дати / часу.


Гаразд, оскільки ніхто фактично не дав фактичної відповіді, ось моя.

Бібліотека - це, безумовно, найкраща ставка для обробки дат і часу стандартним способом. У обчисленнях дати / часу є безліч кращих випадків, тому корисно мати можливість передавати розробку бібліотеці.

Ось список основних бібліотек форматування часу, сумісних з Node:

  • Moment.js [ спасибі Мустафі ] "Легка (4,3 к) бібліотека дат JavaScript для розбору, маніпулювання та форматування дат" - Включає інтернаціоналізацію, обчислення та відносні формати дати - Оновлення 2017-03-29 : Не дуже легка вага будь-яке, але все-таки найбільш комплексне рішення, особливо якщо вам потрібна підтримка часового поясу.
  • date-fns [ додано 2017-03-29, завдяки Fractalf ] Невеликий, швидкий, працює зі стандартними об'єктами дати JS. Чудова альтернатива Моменту, якщо вам не потрібна підтримка часового поясу.
  • SugarJS - загальна бібліотека помічників, що додає необхідні функції вбудованим типам об’єктів JavaScripts. Включає в себе чудові можливості дати та часу.
  • стропінг - Тільки те, що написано, приємно і просто
  • dateutil - Це той, який я використовував до MomentJS
  • node-formatdate
  • TimeTraveller - "Time Traveler надає набір корисних методів для обробки дат. Від додавання та віднімання, до форматування. Time Traveler розширює лише створені ним об'єкти дат, не забруднюючи глобальний простір імен."
  • Tempus [завдяки Dan D] - ОНОВЛЕННЯ: це також можна використовувати з Node та розгортати з npm, дивіться документи

Існують також бібліотеки, що не мають Вузолів:

  • Datejs [спасибі Пітеру Олсону ] - не упакований в npm або GitHub, тому не дуже простий у використанні з Node - не дуже рекомендується, оскільки не оновлюється з 2007 року!

2
Це також є дуже актуальним date-fns.org ( github.com/date-fns/date-fns )
Fractalf

Люди, які стоять за Момент, провели експеримент під назвою Луксон станом на лютий 2018 moment.github.io/luxon/index.html
alxndr

Спасибі @alxndr, виглядає як корисна перезавантаження.
Лицар Джуліана

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

70

Існує бібліотека для конверсії:

npm install dateformat

Потім напишіть свою вимогу:

var dateFormat = require('dateformat');

Потім прив’яжіть значення:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");

див. формат дати


14
Що таке result.request_date?
Дан Даскалеску

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
Ні. Абсолютно використовуйте бібліотеку в цьому випадку. Формат може змінюватися. Навіть якщо це не зміниться, це додає складності коду. Іншим людям, які підтримують ваш код, доведеться витрачати час, намагаючись зрозуміти цю функцію та переконавшись, що вона правильна. Вправи для школи; питання стосувалося використання в реальному житті. Якщо, звичайно, це ваш перший чи другий "справжній" проект; тоді може бути добре зробити щось подібне, тож ви зможете дізнатися, чому не варто цього робити в майбутньому.
оса

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

Я використовую формат дати в 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

Це відбувається з де-локальним (звідси і 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-класів ;

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()
Bablu Ахмеда


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.