แปลงวันที่ ISO เป็นรูปแบบวันที่ yyyy-mm-dd ใน JavaScript


111

ฉันจะรับวันที่ที่มีรูปแบบ yyyy-mm-dd จากวันที่ISO 8601 ได้อย่างไร

วันที่ 8601 ของฉันคือ

2013-03-10T02:00:00Z

ฉันจะรับสิ่งต่อไปนี้ได้อย่างไร?

2013-03-10

2
ได้ลองทำจริงหรือไม่? นี่ไม่ใช่คำถามใหม่ที่มีการตอบหลายครั้ง
bPratik


14
date.split("T")[0]จะทำ
Aravindh Gopi

คำตอบ:


102

ลองทำตามนี้

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

ปรับปรุง: -

ตามที่ระบุไว้ในความคิดเห็นฉันกำลังอัปเดตคำตอบเพื่อพิมพ์เลขศูนย์นำหน้าสำหรับวันที่และเดือนหากจำเป็น

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
หมายเหตุฉันไม่คิดว่านี่จะพิมพ์ศูนย์นำหน้าสำหรับวันหรือเดือน
user3413723

2
เห็นด้วยกับ @ user3413723 สิ่งนี้ไม่ตอบคำถามเพราะลบเลขนำหน้าจึงไม่ตรงตามข้อกำหนดของรูปแบบ YYYY-MM-DD
James Murphy

ทำงานได้ดี @Mritunjay
Ravi Delixan

สิ่งนี้ยาวกว่าและพิมพ์ผิดได้ง่ายกว่าเมื่อเทียบกับคำตอบของ DriveByPoster แต่ฉันจะไม่ให้คะแนนโหวตเพราะเป็นภาษาที่เข้าใจได้ง่ายกว่า มันไม่ได้ใช้เครื่องมือง่ายๆในการกำจัดของเรา
RoboticRenaissance

คุณช่วยบอกวิธีผ่าน 2013 3 1 รูปแบบนี้วันที่ในรูปแบบใหม่วันที่ (วันที่)
Kapil soni

148

เพียงแค่ครอบตัดสตริง:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

หรือถ้าคุณต้องการเฉพาะวันที่ไม่อยู่ในสตริง

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
ฉันคิดว่านี่เป็นทางออกที่ง่ายและสง่างามที่สุดจากพวกเขาทั้งหมด แต่นี่เป็นความหายนะสำหรับสิ่งนี้หรือไม่?
Aida_Aida

30
@Aida_Aida ปัญหาเดียวที่ฉันคิดได้ก็คือถ้ารหัสของคุณเกี่ยวข้องกับเวลามาตราส่วนทางภูมิศาสตร์อย่างน้อย 8000 ปีในอนาคตรหัสของคุณอาจพังได้เนื่องจากรูปแบบจะอยู่YYYYY-MM-DDในปี 10,000 เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถแบ่งTอักขระแทน (ดูen.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
วิธีนี้จะไม่จัดการเขตเวลาอย่างถูกต้องเนื่องจาก ISOString เป็น UTC แต่วัตถุ Date เป็นแบบโลคัล คุณต้องคำนึงถึงสิ่งนี้ด้วย
Guillaume F.

4
@GuillaumeF. การพิจารณาที่สำคัญ แต่เป็นไปตามข้อกำหนดของ OP
jamesjansson

ฉันเข้าใจไม่ได้ว่าทำไมจึงควรแยกวิเคราะห์สตริงเป็นวันที่ substringตัวเลือกที่น่าจะเป็นคำตอบที่ง่ายที่สุด
RobG

47

คุณสามารถชำระเงินMoment.js , Luxon , date-fnsหรือDay.jsเพื่อการจัดการวันที่ที่ดี

หรือเพียงแค่แยกส่วนแรกของสตริง ISO ของคุณมันก็มีสิ่งที่คุณต้องการอยู่แล้ว นี่คือตัวอย่างโดยแยกบนT:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"

15

Moment.jsจะจัดการการจัดรูปแบบวันที่ให้คุณ ต่อไปนี้เป็นวิธีการรวมผ่านแท็ก JavaScript จากนั้นเป็นตัวอย่างวิธีใช้ Moment.js เพื่อจัดรูปแบบวันที่

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่การอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ โปรดพยายามอย่าเบียดโค้ดของคุณด้วยความคิดเห็นเชิงอธิบายเนื่องจากจะช่วยลดความสามารถในการอ่านโค้ดและคำอธิบาย!
Goodbye StackExchange

2
momentเป็นไลบรารีขนาดใหญ่ที่ใช้สำหรับการจัดรูปแบบเท่านั้น ค่อนข้างใช้date-fnsซึ่งมีขนาดเล็กกว่ามากและให้ฟังก์ชันการทำงานเหมือนกัน
Hozefa

@Hozefa แล้วตอบคำถาม OP พร้อมวิธีแก้ปัญหาของคุณ
Harris

1
@ แฮร์ริส - ทำงานได้อย่างราบรื่น!
HadidAli

ฉันหวังว่าช่วงเวลานี้จะมีฟังก์ชั่นบางอย่าง.toISODateString()เพราะเป็นกรณีที่เกิดขึ้นบ่อยมาก ...
Lev Lukomsky

13

นี่คือสิ่งที่ฉันทำเพื่อรับวันที่เท่านั้น:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


2
นี่เป็นคำตอบแรกที่เสนอแนวคิด split () เป็นคำตอบเท่าที่ฉันสามารถบอกได้และฉันชอบวิธีแก้ปัญหานั้นสำหรับความพยายามเทียบกับความน่าเชื่อถือเทียบกับปัจจัยที่มีประสิทธิภาพแม้ว่าฉันจะใช้โมเมนต์ () ทุกที่ที่ทำได้
rainabba

1
toISOString ใช้ UTC ซึ่งจะสร้างวันที่ในท้องถิ่นที่ไม่ถูกต้องสำหรับช่วงเวลาของการชดเชยเขตเวลาท้องถิ่นตั้งแต่เที่ยงคืน - RobG
Michael Dimmitt

10

Moment.jsเป็นไลบรารีขนาดใหญ่สำหรับใช้งานครั้งเดียว ผมแนะนำให้ใช้date-fnsแทน มันมีพื้นการทำงานมากที่สุดของ Moment.js formatting optionsมีขนาดกำมีขนาดเล็กมากและหลาย ๆ

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

สิ่งหนึ่งที่ควรทราบก็คือเนื่องจากเป็นรูปแบบเวลาISO 8601เบราว์เซอร์โดยทั่วไปจะแปลงจากเวลา UTC เป็นเขตเวลาท้องถิ่น แม้ว่านี่จะเป็นกรณีการใช้งานง่ายๆที่คุณสามารถทำได้'2013-03-10T02:00:00Z'.substring(0, 10);แม้ว่าจะเป็นกรณีการใช้งานที่เรียบง่ายนี้ที่คุณอาจจะสามารถทำ

สำหรับการแปลงที่ซับซ้อนมากขึ้นdate-fnsเป็นวิธีที่จะไป


7

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


1
d.toLocaleDateString ('en-GB'); ใช้งานได้เหมือนมีเสน่ห์ ตอบโจทย์มาก!
Donald Shahini


4

สิ่งนี้จะแสดงผลวันที่ในรูปแบบปปปป - ดด - วว:

let date = new Date();
date = date.toISOString().slice(0,10);

ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงไม่ได้รับการโหวตเพิ่มขึ้นมันทำงานได้อย่างสมบูรณ์แบบและตอบคำถามด้วยความพยายามเพียงเล็กน้อย
Wolfiebae

4

ส่งวันที่ของคุณในวัตถุวันที่:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () จะให้ในรูปแบบ "/" ไม่ใช่รูปแบบ "-"
TechCrunch

คุณสามารถใช้ข้างต้นโดยแทนที่ "/" ด้วย "-" ไม่หรูหราที่สุดแม้ว่า toLocaleDateString จะเปลี่ยนแปลงไป
James Murphy

ผลลัพธ์ของtoLocaleDateStringไม่สอดคล้องกันสำหรับผู้ใช้ทั้งหมดดังนั้นอาจไม่ได้ผลลัพธ์ที่ต้องการโดย OP
RobG

4

สำหรับทุกคนที่ใช้การแยกชิ้นส่วนและความพยายามแบบสตริงอื่น ๆ เพื่อรับวันที่คุณอาจตั้งค่าตัวเองสำหรับเขตเวลาที่เกี่ยวข้องกับความล้มเหลว!

ISO-String มี Zulu-Timezone และวันที่ตามเขตเวลานี้ซึ่งหมายความว่าอาจใช้วันก่อนหน้าหรือหลังจากนั้นไปยังเขตเวลาจริงซึ่งคุณต้องคำนึงถึงในห่วงโซ่การเปลี่ยนแปลงของคุณ

ดูตัวอย่างนี้:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

หากคุณมีวัตถุวันที่:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

หรือ

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOStringใช้ UTC ซึ่งจะสร้างวันที่ในท้องถิ่นที่ไม่ถูกต้องสำหรับช่วงเวลาของการชดเชยเขตเวลาท้องถิ่นตั้งแต่เที่ยงคืน
RobG

1

หากต้องการขยายโซลูชันของrk rk : ในกรณีที่คุณต้องการให้รูปแบบรวมเวลาคุณสามารถเพิ่มลงในtoTimeString()สตริงของคุณจากนั้นตัดส่วน GMT ดังต่อไปนี้:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

1

คำตอบที่ดีกว่าโดย@Hozefa @Hozefa

หากคุณdate-fnsติดตั้งคุณสามารถใช้ฟังก์ชันformatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

0

ฉันใช้สิ่งนี้:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

ที่มา: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/



0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

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