แปลงสตริง dd-mm-yyyy เป็นวันที่


184

ฉันพยายามแปลงสตริงในรูปแบบ dd-mm-yyyy เป็นวัตถุวันที่ใน JavaScript โดยใช้สิ่งต่อไปนี้:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()มีวันที่ในรูปแบบ dd-mm-yyyy เมื่อฉันทำสิ่งต่อไปนี้ฉันจะได้รับ "วันที่ไม่ถูกต้อง":

alert(f);

เป็นเพราะสัญลักษณ์ '-' ใช่ไหม ฉันจะเอาชนะสิ่งนี้ได้อย่างไร


สิ่งนี้เกิดขึ้นกับวันที่ทั้งหมดหรือวันใดวันหนึ่งโดยเฉพาะหรือไม่?
kasdega

คำตอบ:


326

แยกไปที่ "-"

แยกสตริงเป็นส่วนที่คุณต้องการ:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

ใช้ regex

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

ทำไมไม่ใช้ regex

เพราะคุณรู้ว่าคุณกำลังทำงานกับสตริงที่ประกอบด้วยสามส่วนคั่นด้วยยัติภังค์

อย่างไรก็ตามหากคุณกำลังมองหาสตริงเดียวกันภายในสตริงอื่น regex จะเป็นวิธีที่จะไป

นำมาใช้ใหม่

เนื่องจากคุณกำลังทำสิ่งนี้มากกว่าหนึ่งครั้งในโค้ดตัวอย่างของคุณและอาจจะอยู่ที่อื่นในฐานรหัสของคุณให้รวมไว้ในฟังก์ชัน:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

ใช้เป็น:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

หรือถ้าคุณไม่สนใจ jQuery ในฟังก์ชั่นของคุณ:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

ใช้เป็น:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript ที่ทันสมัย

หากคุณสามารถใช้ JS ที่ทันสมัยกว่านี้ได้การทำลายล้างอาร์เรย์ก็เป็นสิ่งที่ดีเช่นกัน:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
เอาชนะฉันไป ... แต่ฉันยังคงใช้ DateJs อยู่ สิ่งนี้ไม่ถูกต้องเนื่องจากข้อผิดพลาดในการโพสต์รั้ว เดือนคือ 0-11 ดังนั้นคุณต้องลบ 1 f = new Date (จาก [2], จาก [1] -1, จาก [0]);
kasdega

12
คำตอบที่เลือกพร้อมข้อบกพร่องที่ทำให้เกิดวันที่ไม่ถูกต้อง ! น่ากลัว
epascarello

3
Cheers @kasdega - แก้ไขแล้ว ... เมื่อไม่นานมานี้!
Adrian Lynch

@AdrianLynch วิธีการแปลง "Month dd, yyyy" เป็น "MM / dd / yyyy" ใน javascript?
dilipkumar1007

1
@Adrian Lynch ตัวเลือก JavaScript ที่ทันสมัยดีมาก! ขอบคุณ.
Alexandre Ribeiro

134

ตัวอย่างการแสดงออกปกติ:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
การแก้ไขที่ต้องใช้/คือตัวคั่นและหนึ่งปีที่ทำด้วยตัวเลข 2 หลัก (หรือจำนวนที่มากกว่า 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
ทำไมนี่เป็นคำตอบที่เลือก @AdemirNuno ทำไมต้องใช้ RegEx สำหรับสตริงในรูปแบบที่รู้จัก? คุณไม่ได้มองหาลวดลายคุณรู้ว่าตัวเลขแรกคือวันที่สองเดือนและปีที่สาม RegEx เป็นเครื่องมือที่ผิดสำหรับงานในกรณีนี้
Adrian Lynch

การแก้ไขที่ใช้ตัวคั่นที่ไม่ใช่ตัวเลขวันที่ไม่มีเลขศูนย์นำหน้าและ 2 หรือ 4 หลักปี: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH

เป็นคนที่ฝึกซ้อมขอบคุณมาก รูปแบบวันที่ของฉันมาพร้อมกับเวลาดังนั้นฉันจึงบันทึกเป็น: 'new Date ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' ถูกไหม
Kamuran Sönecek

@NeerajSingh วิธีการแปลง "Month dd, yyyy" เป็น "MM / dd / yyyy" ใน javascript?
dilipkumar1007

15

ความเป็นไปได้อื่น:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

จับคู่ตัวเลขและจัดลำดับใหม่


นอกจากนี้คำถามดั้งเดิมที่ระบุ "dd-mm-yyyy" ไม่ใช่ "mm-dd-yyyy" ดังนั้นจึงยังคงผิด (แต่มีเพียง)
Phil M Jones

@epascarello วิธีการแปลง "Month dd, yyyy" เป็น "MM / dd / yyyy" ใน javascript?
dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes

7

ใช้ตัวอย่างmoment.js :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

1
ช่วงเวลา (จาก "DD-MM-YYYY") ถึงวันที่ ()
Lapenkov Vladimir

6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
คุณได้รับ Date.parseDate หรือไม่
kasdega

@kasdega ขออภัยฉันคิดว่า $ .datepicker.parseDate แก้ไขมันตอนนี้ :)
Saad Imran

คุณควรใช้$.datepicker.parseDate("dd-mm-yy", from);การแยกวิเคราะห์วันที่อย่างถูกต้องเช่น24-01-2017chek datepicker เอกสารที่api.jqueryui.com/datepicker
Andrea Mauro

4

คุณยังสามารถเขียนวันที่ในวงเล็บของDate()วัตถุเช่นนี้

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar วิธีการแปลง "Month dd, yyyy" เป็น "MM / dd / yyyy" ใน javascript?
dilipkumar1007

3

ใช้รูปแบบนี้: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
คุณได้รับparseDateหน้าที่นั้นมาจากไหน นั่นคือฟังก์ชั่นจาวาสคริปต์ดั้งเดิมหรือไม่?
Joseph Silber

ขอโทษฉันจะใช้สิ่งนี้ได้อย่างไร ฉันต้องการรูปแบบเช่น dd-mm-yy
user559142

parseDate เป็นฟังก์ชัน JS ดั้งเดิม ดูข้อมูลเพิ่มเติมได้ที่: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane

1
@Diodeus ... มันเป็นของพื้นเมืองหรือเปล่า ทำไมข้อผิดพลาด ff และ chrome มาถึงอย่างไร
epascarello

2
@Diodeus แม้ว่าจะมีการแก้ไขครั้งล่าสุด แต่ก็ไม่ได้ผลสำหรับฉัน (ด้วย Chrome อย่างน้อย) ได้กำหนดวันที่'2011-01-03'และเวลา UTC 00:00:00ไป ดังนั้นหากเขตเวลาของผู้ใช้น้อยกว่า UTC จะเป็นวันก่อนหน้า
Mike

3

ในกรณีของฉัน

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

ผล: จันทร์พฤศจิกายน 02 2015 04:40:13 GMT + 0100 (CET) จากนั้นฉันใช้. getTime () เพื่อทำงานกับมิลลิวินาที


3

คำตอบที่ได้รับการยอมรับมีข้อบกพร่อง

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

พิจารณาว่า datepicker มี "77-78-7980" ซึ่งเห็นได้ชัดว่าไม่ใช่วันที่ที่ถูกต้อง สิ่งนี้จะส่งผลให้:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

ซึ่งอาจไม่ได้ผลลัพธ์ที่ต้องการ

เหตุผลนี้อธิบายไว้ในเว็บไซต์MDN :

โดยที่ Date ถูกเรียกว่าเป็นนวกรรมิกที่มีมากกว่าหนึ่งอาร์กิวเมนต์หากค่ามากกว่าช่วงตรรกะ (เช่น 13 มีให้เป็นค่าเดือนหรือ 70 สำหรับค่านาที) ค่าติดกันจะถูกปรับ เช่นเทียบเท่ากับnew Date(2013, 13, 1)new Date(2014, 1, 1)


วิธีที่ดีกว่าในการแก้ปัญหาคือ:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

สิ่งนี้จะช่วยให้คุณสามารถจัดการกับอินพุตที่ไม่ถูกต้องได้

ตัวอย่างเช่น:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}

2

คุณสามารถใช้ไลบรารีภายนอกเพื่อช่วยคุณได้

http://www.mattkruse.com/javascript/date/source.html

getDateFromFormat(val,format);

ดูเพิ่มเติมที่: สตริงการแยกวิเคราะห์ DateTime ใน JavaScript


วิธีการแปลง myDate = '20 / 06/17 'เป็นรูปแบบ '20 / 6/2017 00:00:00' ในรูปแบบจาวาสคริปต์?
Ghanshyam Lakhani

1

ลองดูที่ Datejsสำหรับประเด็นที่เกี่ยวข้องกับวันที่เหล่านั้น .. คุณสามารถแก้ไขได้ด้วยฟังก์ชั่น parseDate ด้วย


0

คุณสามารถใช้ Regexp

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

ผลิตเดือนที่ไม่ถูกต้อง! เดือนเริ่มต้นที่ศูนย์ไม่ใช่หนึ่งเดือน ดังนั้นถ้าคุณทำ ม.ค. คุณจะพูดว่า ก.พ.
epascarello

1
@epascarello - ลืมว่า API วันนี้เป็นอย่างไร
ChaosPandion

@ChaosPandion: วิธีแปลง myDate = '20 / 06/17 'เป็นรูปแบบ '20 / 6/2017 00:00:00' ในรูปแบบจาวาสคริปต์?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

ง่ายๆเพียงแค่ส่งวันที่ของคุณไปยัง js Date Object


คุณหมายถึงการส่งสตริงวันที่ภายในตัวสร้างวันที่เช่นnew Date('30/12/2018').toLocaleDateString()? นั่นส่งคืนวันที่ไม่ถูกต้อง
Ms.Tamil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.