Làm cách nào để định dạng ngày UTC dưới dạng chuỗi `YYYY-MM-DD hh: mm: ss` bằng NodeJS?


242

Sử dụng NodeJS, tôi muốn định dạng a Datethành định dạng chuỗi sau:

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

Làm thế nào để làm điều đó?


4
Đó là một loại bận tâm để làm mà không có bất kỳ thư viện. Tôi khuyên bạn nên sử dụng datejs
Peter Olson


hoặc Tempus
Dan D.

Tempus làm việc tuyệt vời. Vấn đề quảng cáo sẽ khoảnh khắc.
Tampa

1
Cả Datejs và Tempus đều không phải là thư viện Node (mặc dù chúng có thể được sử dụng với Node, bạn không thể sử dụng trình cài đặt thư viện npm). Vì không ai đưa ra những câu trả lời này như câu trả lời thực tế, tôi đã tự mình làm điều đó.
Julian Knight

Câu trả lời:


530

Nếu bạn đang sử dụng Node.js, bạn chắc chắn có EcmaScript 5 và vì vậy Date có một toISOStringphương thức. Bạn đang yêu cầu sửa đổi một chút về ISO8601:

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

Vì vậy, chỉ cần cắt bỏ một số thứ, và bạn đã thiết lập:

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

Hoặc, trong một dòng: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 nhất thiết phải là UTC (cũng được biểu thị bằng dấu Z ở kết quả đầu tiên), do đó bạn nhận được UTC theo mặc định (luôn luôn là một điều tốt).


4
Giải pháp thông minh và đơn giản giúp tránh sử dụng các thư viện - tốt đẹp!
Wingman4l7

11
Trong trường hợp bạn gặp lỗi, Object has no method 'toISOString'bạn đã bỏ lỡnew
allenhwkim

29
Một điều cần lưu ý là sử dụng các biểu thức thông thường theo cách này rất chậm và bạn thậm chí không cần chúng ở đây, điều này: new Date().toISOString().replace('T', ' ').substr(0, 19)hoạt động tốt.
Killah

2
Lưu ý rằng bằng cách loại bỏ múi giờ, giờ đây nó biểu thị một thời điểm khác nhau trong mỗi múi giờ với độ lệch khác nhau.
RobG

1
@RobG Bạn có thể nói rằng về bất kỳ biểu diễn thời gian ngày nào không có múi giờ rõ ràng.
Phil

105

CẬP NHẬT 2017 / 03-29: Đã thêm ngày-fns, một số ghi chú về Khoảnh khắc và Ngày cập
nhật 2016-09-2014: Đã thêm SugarJS dường như có một số chức năng ngày / giờ tuyệt vời.


OK, vì không ai thực sự cung cấp một câu trả lời thực sự, đây là của tôi.

Một thư viện chắc chắn là đặt cược tốt nhất để xử lý ngày và thời gian theo cách tiêu chuẩn. Có rất nhiều trường hợp cạnh trong tính toán ngày / giờ vì vậy rất hữu ích khi có thể bắt tay phát triển vào thư viện.

Dưới đây là danh sách các thư viện định dạng thời gian tương thích Node chính:

  • Moment.js [ nhờ Mustafa ] "Thư viện ngày javascript nhẹ (4.3k) để phân tích cú pháp, thao tác và định dạng ngày" - Bao gồm quốc tế hóa, tính toán và định dạng ngày tương đối - Cập nhật 2017-03-29 : Không quá nhẹ không còn nữa nhưng vẫn là giải pháp toàn diện nhất, đặc biệt nếu bạn cần hỗ trợ múi giờ.
  • date-fns [ đã thêm 2017-03-29, nhờ Fractalf ] Nhỏ, nhanh, hoạt động với các đối tượng ngày JS tiêu chuẩn. Thay thế tuyệt vời cho Khoảnh khắc nếu bạn không cần hỗ trợ múi giờ.
  • SugarJS - Một thư viện trợ giúp chung bổ sung nhiều tính năng cần thiết cho các loại đối tượng tích hợp sẵn JavaScripts. Bao gồm một số khả năng tìm kiếm ngày / thời gian tuyệt vời.
  • strftime - Đúng như những gì nó nói, hay và đơn giản
  • dateutil - Đây là cái tôi đã từng sử dụng trước MomentJS
  • định dạng nút
  • TimeTraveller - "Time Traveller cung cấp một tập hợp các phương thức tiện ích để xử lý ngày. Từ cộng và trừ, đến định dạng. Time Traveller chỉ mở rộng các đối tượng ngày mà nó tạo ra, mà không gây ô nhiễm không gian tên toàn cầu."
  • Tempus [nhờ Dan D] - CẬP NHẬT: điều này cũng có thể được sử dụng với Node và được triển khai với npm, xem tài liệu

Ngoài ra còn có các thư viện không phải là Node:

  • Datejs [nhờ Peter Olson] - không được đóng gói trong npm hoặc GitHub nên không dễ sử dụng với Node - không thực sự được khuyến nghị là không được cập nhật kể từ năm 2007!

2
Điều này cũng rất có liên quan date-fns.org ( github.com/date-fns/date-fns )
Fractalf

(Các) dân gian đằng sau Khoảnh khắc có một thử nghiệm gọi là Luxon kể từ tháng 2 năm 2018 khoảnh khắc.github.io / luxon / index.html
alxndr

Cảm ơn @alxndr, có vẻ như một khởi động lại hữu ích.
Julian Knight

Khoảnh khắc + toISOString () trên RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane

70

Có thư viện để chuyển đổi:

npm install dateformat

Sau đó viết yêu cầu của bạn:

var dateFormat = require('dateformat');

Sau đó ràng buộc giá trị:

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

thấy DateFormat


14
result.request_date
Dan Dascalescu

45

Tôi không có gì chống lại các thư viện nói chung. Trong trường hợp này, một thư viện mục đích chung có vẻ quá mức, trừ khi các phần khác của quy trình ứng dụng ngày rất nhiều.

Viết các hàm tiện ích nhỏ như đây cũng là một bài tập hữu ích cho cả lập trình viên mới bắt đầu và thành đạt như nhau và có thể là một kinh nghiệm học tập cho người mới trong số chúng ta.

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
Trong khi điều này thực sự có thể hữu ích cho việc học, tôi sẽ không đồng ý rằng đây là một kết quả tốt hơn so với việc sử dụng một thư viện nhỏ, được xây dựng tốt. Một thư viện sẽ được duy trì và có nhiều khả năng bao gồm các trường hợp cạnh trong thiết kế có thể không rõ ràng đối với bạn ngay từ cái nhìn đầu tiên nhưng có thể dễ dàng cắn vào một số tính toán điểm / thời gian đặc biệt dễ xảy ra do sự phức tạp vốn có của chúng.
Julian Knight

8
Đây là cách sử dụng rất tốt phương thức String.replace (), +1 cho sự sáng tạo
JamieJag

5
Không. Hoàn toàn sử dụng một thư viện trong trường hợp này. Các định dạng có thể thay đổi. Ngay cả khi nó không thay đổi, điều này đang thêm độ phức tạp vào mã. Những người khác duy trì mã của bạn sẽ phải mất thời gian, cố gắng hiểu chức năng này và đảm bảo rằng nó là chính xác. Bài tập dành cho trường học; câu hỏi là về cách sử dụng thực tế. Trừ khi, tất nhiên, đây là dự án "thực sự" thứ nhất hoặc thứ hai của bạn; sau đó có thể là tốt để làm một cái gì đó như vậy, vì vậy bạn có thể tìm hiểu lý do tại sao bạn không nên làm điều đó trong tương lai.
osa

3
Tôi đánh giá cao tâm lý chung của việc sử dụng các thư viện dưới dạng mã đã được chứng minh / chiến đấu nhưng chúng cũng có thể thêm độ phức tạp triển khai. Mã này ủy quyền tất cả các phép tính liên quan đến lịch cho đối tượng Date bên dưới và chỉ gọi các ví dụ, phương thức getUTCDate () ở vị trí thích hợp. Ngoài ra, nếu bất kỳ ai tìm thấy lỗi trong mã này, họ có thể báo cáo tại đây trên stackoverflow.com, về cơ bản phù hợp với khía cạnh nhiều lỗi / lỗi nông của bất kỳ thư viện nào khác. +1
hấp25

11

Cách dễ dàng đọc và tùy chỉnh để có dấu thời gian ở định dạng mong muốn của bạn mà không cần sử dụng bất kỳ thư viện nào:

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())
}

(Nếu bạn cần thời gian ở định dạng UTC, thì chỉ cần thay đổi các lệnh gọi hàm. Ví dụ: "getMonth" trở thành "getUTCMonth")


9

Thư viện javascript sugar.js ( http://sugarjs.com/ ) có các chức năng định dạng ngày

Thí dụ:

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

3
Trông giống như một thư viện thực sự tuyệt vời. Định dạng của chúng khá lắt léo và tài liệu của chúng cho thấy các giải pháp tao nhã cho hàng trăm thứ khác mà tôi đã thất vọng với JavaScript. Đi để thử cái này
eimajenthat

6

Sử dụng phương thức được cung cấp trong đối tượng Date như sau:

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

Nó trông rất bẩn, nhưng nó sẽ hoạt động tốt với các phương thức lõi của JavaScript


2
Tôi đồng ý rằng bạn cần thêm 1 vào getMonth () kể từ tháng 1 trở về 0, nhưng tôi không nghĩ bạn muốn thêm 1 vào getDate ().
Steve Onorato

5

Tôi đang sử dụng DateFormat tại Nodejs và angularjs, vì vậy tốt

Tải về

$ npm install dateformat
$ dateformat --help

bản giới thiệu

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

Chào mừng bạn đến với StackOverflow. Vui lòng chỉnh sửa câu trả lời của bạn, hoặc bạn có thể bị bỏ phiếu. Như bây giờ, nó chỉ là một gợi ý không có ngữ cảnh. Xin vui lòng xem ở đây để làm thế nào để viết một câu trả lời tốt .
jacefarm

Điều này xảy ra với de-locale (do đó là toLocaleString):3.2.2015, 15:30:00
alwe

2

Thay thế # 6233 ....

Thêm phần bù UTC vào giờ cục bộ, sau đó chuyển đổi nó sang định dạng mong muốn bằng toLocaleDateString()phương thức của Dateđối tượng:

// 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));

Tôi đang tạo một đối tượng ngày mặc định theo giờ địa phương. Tôi đang thêm UTC tắt cho nó. Tôi đang tạo một đối tượng định dạng ngày. Tôi đang hiển thị ngày / giờ UTC theo định dạng mong muốn:

nhập mô tả hình ảnh ở đây


1

Sử dụng x-datemô đun là một trong các mô đun con của thư viện lớp 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(/\..+/, '') 

với .toString (), Điều này trở thành định dạng

thay thế (/ T /, ''). // thay T thành '' 2017-01-15T ...

thay thế (/..+/, '') // cho ... 13: 50: 16.1271

ví dụ, xem var datehour:

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
Bạn có thể cung cấp một số lời giải thích như bối cảnh đằng sau câu trả lời của bạn?
T-Heron

Chào mừng bạn đến với StackOverflow. Vui lòng chỉnh sửa câu trả lời của bạn, hoặc bạn có thể bị bỏ phiếu. Như bây giờ, nó chỉ là một gợi ý không có ngữ cảnh. Xin vui lòng xem ở đây để làm thế nào để viết một câu trả lời tốt .
jacefarm

@ user7396942 - hiện đã được bình chọn, để thêm ngữ cảnh / giải thích vào câu trả lời của bạn. Tuyên bố miễn trừ trách nhiệm: Tôi không phải là người trước đây đã bỏ phiếu, vì bây giờ nó có vẻ tốt hơn nhiều .
T-Heron

3
Tại sao .toString("yyyyMMddHHmmss")?
Arjan

1

Đối với định dạng ngày, cách dễ nhất là sử dụng thời điểm lib. https://momentjs.com/

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

Cảm ơn, @ Jazeb_007 nó hoạt động với tôi ngay cả khi tôi không cần toISOString()toUTCString()
Bablu Ahmed


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;
}

-1

Tôi nghĩ rằng điều này thực sự trả lời câu hỏi của bạn.

Thật khó chịu khi làm việc với ngày / giờ trong javascript. Sau một vài sợi tóc màu xám, tôi nhận ra rằng nó thực sự khá đơn giản.

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

Đây là một câu đố


Bạn cần thêm 1 vào tháng không dựa trên.
Mistic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.