วิธีการจัดรูปแบบวันที่ 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
Peter Olson


หรือTempus
Dan D.

เวลาทำงานได้ดี ปัญหาโฆษณาจะเกิดขึ้น
แทมปา

1
Datejs หรือ Tempus นั้นเป็น Node libraries (แม้ว่าจะสามารถใช้กับ Node ได้ แต่คุณไม่สามารถใช้ตัวติดตั้งไลบรารี npm) ในขณะที่ไม่มีใครตอบคำถามเหล่านี้ได้จริงฉันทำเอง
Julian Knight

คำตอบ:


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

UPDATE 2017-03-29: เพิ่ม date-fns, บันทึกบางอย่างเกี่ยวกับ Moment และ Datejs
UPDATE 2016-09-14: เพิ่ม SugarJS ซึ่งดูเหมือนว่าจะมีฟังก์ชั่นวันที่ / เวลาที่ยอดเยี่ยม


ตกลงเนื่องจากไม่มีใครให้คำตอบจริงนี่คือของฉัน

ห้องสมุดเป็นทางออกที่ดีที่สุดสำหรับการจัดการวันที่และเวลาอย่างเป็นมาตรฐาน มีกรณีขอบจำนวนมากในการคำนวณวันที่ / เวลาดังนั้นจึงเป็นประโยชน์ที่จะสามารถส่งการพัฒนาไปยังไลบรารี

นี่คือรายการของไลบรารีการจัดรูปแบบเวลาที่เข้ากันได้ของโหนดหลัก:

  • Moment.js [ ขอบคุณมุสตาฟา ] "ไลบรารี่จาวาสคริปต์ขนาดเบา (4.3k) สำหรับการแยกวิเคราะห์จัดการและจัดรูปแบบวันที่" - รวมความเป็นสากลการคำนวณและรูปแบบวันที่สัมพัทธ์ - อัปเดต 2017-03-25 : ไม่ค่อนข้างเบา แต่ยังคงเป็นโซลูชันที่ครอบคลุมที่สุดโดยเฉพาะหากคุณต้องการการสนับสนุนเขตเวลา
  • date-fns [ เพิ่ม 2017-03-29 ขอบคุณ Fractalf ] เล็กเร็วทำงานกับออบเจ็กต์วันที่ JS มาตรฐาน ทางเลือกที่ยอดเยี่ยมสำหรับช่วงเวลาถ้าคุณไม่ต้องการการสนับสนุนเขตเวลา
  • SugarJS - ห้องสมุดผู้ช่วยทั่วไปที่เพิ่มคุณสมบัติที่จำเป็นมากให้กับ JavaScripts ประเภทวัตถุในตัว รวมถึงความสามารถในการดูวัน / เวลาที่ยอดเยี่ยม
  • strftime - สิ่งที่มันบอกว่าดีและเรียบง่าย
  • dateutil - นี่คือสิ่งที่ฉันเคยใช้ก่อน MomentJS
  • โหนด formatdate
  • TimeTraveller - "Time Traveller มีชุดวิธียูทิลิตี้เพื่อจัดการกับวันที่จากการเพิ่มและลบไปจนถึงการจัดรูปแบบ Time Traveler จะขยายเฉพาะวัตถุวันที่ที่สร้างขึ้นโดยไม่สร้างมลภาวะเนมสเปซส่วนกลาง"
  • Tempus [ขอบคุณ Dan D] - อัปเดต: สามารถใช้กับโหนดและปรับใช้กับ npm ดูเอกสาร

นอกจากนี้ยังมีไลบรารีที่ไม่ใช่โหนด:

  • Datejs [ขอบคุณ Peter Olson] - ไม่ได้บรรจุในรูปแบบ npm หรือ GitHub ดังนั้นจึงไม่ใช่เรื่องง่ายที่จะใช้กับ Node - ไม่แนะนำอย่างยิ่งว่าจะไม่ได้รับการปรับปรุงตั้งแต่ปี 2550!

2
นี้ยังมีความเกี่ยวข้องสูงdate-fns.org ( github.com/date-fns/date-fns )
Fractalf

ชาวบ้านที่อยู่เบื้องหลังช่วงเวลานั้นมีการทดลองที่เรียกว่า Luxon เมื่อวันที่กุมภาพันธ์ 2018 moment.github.io/luxon/index.html
alxndr

ขอบคุณ @alxndr ดูเหมือนว่าการรีบูตที่มีประโยชน์
Julian Knight

ช่วงเวลา + toISOString () บน RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane

70

มีห้องสมุดสำหรับการแปลง:

npm install dateformat

จากนั้นเขียนความต้องการของคุณ:

var dateFormat = require('dateformat');

จากนั้นผูกค่า:

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

ดูdateformat


14
คือresult.request_dateอะไร
Dan Dascalescu

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
ขณะนี้สิ่งนี้อาจมีประโยชน์สำหรับการเรียนรู้ฉันต้องไม่เห็นด้วยว่านี่เป็นผลลัพธ์ที่ดีกว่าการใช้ห้องสมุดขนาดเล็กที่สร้างขึ้นอย่างดี ห้องสมุดจะได้รับการดูแลรักษาและมีแนวโน้มที่จะครอบคลุมกรณีที่มีขอบในการออกแบบที่อาจไม่ชัดเจนสำหรับคุณตั้งแต่แรกเห็น แต่สามารถกัดได้ง่ายในบางจุด - การคำนวณวันที่ / เวลามักจะมีปัญหาเหล่านี้เนื่องจากความซับซ้อนโดยธรรมชาติ
Julian Knight

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

ใช้วิธีการที่ให้ไว้ในวัตถุวันที่ดังต่อไปนี้:

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 to getMonth () ตั้งแต่เดือนมกราคมกลับมาเป็น 0 แต่ฉันไม่คิดว่าคุณต้องการเพิ่ม 1 to getDate ()
Steve Onorato

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-สถาน (เพราะฉะนั้น toLocaleString) ที่:3.2.2015, 15:30:00
alwe

2

ทางเลือก # 6233 ....

เพิ่ม UTC offset เป็นเวลาท้องถิ่นจากนั้นแปลงเป็นรูปแบบที่ต้องการด้วย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 - โหวตตอนนี้เพื่อเพิ่มบริบท / คำอธิบายในคำตอบของคุณ Disclaimer: ผมไม่ได้เป็นคนหนึ่งที่เคยลงรับการโหวตให้เป็นมันยืนตอนนี้มันก็ดูมากดีกว่า
T-Heron

3
ทำไม.toString("yyyyMMddHHmmss")?
Arjan

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 Ahmed

0

ฉันต้องการไลบรารีการจัดรูปแบบที่เรียบง่ายโดยไม่มีเสียงระฆังและเสียงนกหวีดของภาษาและการสนับสนุน ดังนั้นฉันจึงแก้ไข

http://www.mattkruse.com/javascript/date/date.js

และใช้มัน ดูhttps://github.com/adgang/atom-time/blob/master/lib/dateformat.js

เอกสารประกอบค่อนข้างชัดเจน


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 เดือนซึ่งเป็นไปตามศูนย์
Mistic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.