มีเหตุผลทางเทคนิคใด ๆ หรือไม่ในการเขียนโปรแกรมรูปแบบวันที่เริ่มต้นคือ YYYYMMDD และไม่ใช่อย่างอื่น?


118

มีเหตุผลด้านวิศวกรรมใด ๆ ทำไมมันเป็นเช่นนั้น? ฉันสงสัยในกรณีของ RDBMS ว่ามีบางอย่างเกี่ยวกับการแสดงเนื่องจาก "YEAR" มีความเฉพาะเจาะจงมากกว่า "MONTH" เช่นคุณมีเพียงหนึ่งปี 2000 แต่ทุกปีมี "มกราคม" ซึ่งจะทำให้ง่ายขึ้น / เร็วขึ้นในการกรอง / เรียงลำดับบางสิ่งบางอย่างในปีแรกและนั่นเป็นสาเหตุที่ปีนี้มาก่อน

แต่ฉันไม่รู้ว่ามันสมเหตุสมผลจริงหรือ ... มีเหตุผลอะไรบ้าง?


14
@IMil เราอาจไม่ชอบ แต่บ่อยครั้งที่พวกมันถูกเก็บไว้เป็นสตริง
Honza Brabec

14
@candied_orange นั่นคงจะแปลกโดยเฉพาะในกรณีของวันที่
glglgl


19
ตามบันทึกข้าง, รูปแบบนี้ไม่ได้ว่ามนุษย์ต่างดาว ตัวอย่างเช่นในภาษาฮังการี (และอาจเป็นภาษาอื่นด้วย) YYYY เอ็มเอ็ม DD เป็นรูปแบบวันที่เริ่มต้นและเป็นเวลานานก่อนที่คอมพิวเตอร์
Neinstein

31
ในการเขียนโปรแกรมรูปแบบวันที่เริ่มต้นคือ "YYYYMMDD" หรือไม่ มันคงจะดีถ้ามันเป็นเรื่องจริง แต่นั่นไม่ใช่กรณีทุกที่ RFC 822 และ RFC 850 รวมถึง ANSI C asctimeยังคงใช้กันอย่างแพร่หลายในหลาย ๆ ที่ เป็นเรื่องดีที่ RFC 3339 และ ISO 8601 กำลังค่อยๆแทนที่รูปแบบที่เก่ากว่าและแน่นอนว่าสิ่งเหล่านี้ควรจะใช้ในอนาคต โดยทั่วไปแล้วฉันจะบอกว่ารูปแบบพื้นฐาน ISO 8601 (YYYYMMDD ธรรมดาที่ไม่มีตัวคั่น) จริง ๆ แล้วพบได้น้อยกว่ารูปแบบอื่น ๆ เช่น YYYY-MM-DD
Daniel Pryden

คำตอบ:


386

ด้วยวิธีนี้วันที่สามารถจัดเรียงเป็นสตริงได้อย่างง่ายดายโดยใช้กฎการเรียงลำดับเริ่มต้น (เช่นการจัดเรียงพจนานุกรม )

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

ในความเป็นจริงก็เป็นหนึ่งในรูปแบบวันที่ที่กำหนดโดยมาตรฐาน ISO 8601 มาตรฐานนั้นยังกำหนดรูปแบบวันที่และเวลา2015-03-27T15:26:40Zซึ่งสามารถจัดเรียงเป็นสตริงได้

อย่างไรก็ตาม YYYYMMDD มีประโยชน์เพิ่มเติมในการทำให้เป็นไปได้อย่างง่ายดาย (ไม่มีสตริงย่อยหรือการแทนที่อักขระที่เกี่ยวข้อง) แยกสตริงเป็นจำนวนเต็มและยังคงใช้การเรียงลำดับเริ่มต้นกับจำนวนเต็ม


90
@lucaswxp: ถ้าคุณเขียนการเปรียบเทียบตัวพิมพ์เล็ก - ใหญ่สำหรับสตริงที่ตามสคีมาคุณสามารถทำให้มันเป็นแบบบาโรกได้ตามที่คุณต้องการ สิ่งที่นี่คือสคีมาที่ได้รับการออกแบบเพื่อให้คำศัพท์ (เช่นเดียวกับคำสั่งจำนวนรู้จำคำ) เป็นคำสั่งตรรกะดังนั้นจึงไม่จำเป็นต้องปรับแต่ง
Deduplicator

19
@lucaswxp สตริงวันที่ของคุณอาจไม่อยู่ในหน่วยความจำ ตัวอย่างการปฏิบัติ: คุณมีไฟล์ csv ที่เรียงลำดับตามวันที่ ISO และจำนวนแถว + ต่อปี และคุณต้องการคืนเฉพาะแถวระหว่างวันที่กำหนด คุณสามารถอ่านไฟล์ทีละบรรทัด (แถวต่อแถว) จนกว่าคุณจะถึงวันแรกของคุณจากนั้นโหลดแถวเข้าสู่หน่วยความจำจนกว่าคุณจะถึงวันที่ คุณสามารถข้ามส่วนที่เหลือของไฟล์ แต่ถ้าคุณบันทึกวันที่เป็นรูปแบบอื่นหรือเรียงตามปีเท่านั้นคุณจะต้องอ่านค่าระเบียนทั้งปีก่อนที่จะปิดไฟล์
Tom A. Vibeto

48
โปรดทราบว่าเครื่องหมายขีดคั่นเป็นทางเลือกใน ISO 8601 ดังนั้น YYYYMMDD คือ ISO 8601
Martin Ba

32
@Benoit มีการทำข้อเสนอเพื่อแก้ไขปัญหา Y10K แล้ว หากเรายังคงใช้ยุคเดียวกันเราจะไปที่ AYYYYYYMMDD จนถึง Y100K ซึ่งจะเป็น BYYYYYYYMMDD, CYYYYYYYYMMDD, DYYYYYYYYYYDDD ส่วนนำหน้า alpha นี้ยืนยันลำดับการจัดเรียงที่ถูกต้อง (โดยมีเงื่อนไขว่า "A0YYYY ... " ฯลฯ เป็นตัวแทนที่ไม่ถูกต้องหากยังมีการใช้วันที่ YYYY ... ในบางจุดเมื่อจำนวนหลักปีหารด้วยสามเราจะเริ่มเพิ่มตัวเลขสามหลักทุกครั้งที่เราเปลี่ยนคำนำหน้าอัลฟ่าเพื่อให้มั่นใจว่าเราจะไม่เหลือตัวอักษรก่อนที่ความร้อนจากจักรวาลจะตาย
Monty Harder

35
สิ่งสำคัญคือต้องทราบว่าด้วยรูปแบบนี้การเรียงลำดับไม่เพียง "ง่ายขึ้น" คำศัพท์ (ตัวอักษร based) เรียงลำดับกลายเป็นเทียบเท่ากับการจัดเรียงชั่วคราวซึ่งหมายความว่าคุณสามารถค้นหาที่พักชั่วคราวโดยไม่ต้องแยก
jpmc26

135

ยังไม่ได้กล่าวถึง แต่คุณจะปัดเศษการสั่งซื้อภายใน YYYY อย่างรวดเร็ว นั่นเป็นพันปีมาแล้วหลายศตวรรษหลายสิบปี กล่าวคือ YYYY ได้รับคำสั่งจากระยะเวลาที่ยาวที่สุดถึงระยะเวลาที่สั้นที่สุดแล้ว เช่นเดียวกันกับ MM และ DD นั่นคือวิธีที่ระบบตัวเลขทำงาน

ดังนั้นเพื่อรักษาลำดับระหว่างเขตข้อมูลให้สอดคล้องกับคำสั่งซื้อภายในเขตข้อมูลตัวเลือกเดียวคือ YYYYMMDD

ตามที่ zahbaz และ Arseni Mourzenko ตั้งข้อสังเกตรูปแบบ YYYYMMDD จะเรียงลำดับได้อย่างง่ายดาย นั่นไม่ใช่เรื่องบังเอิญที่โชคดีนั่นเป็นผลโดยตรงจากการใส่ฟิลด์ในช่วงเวลาที่ยาวที่สุดก่อน (และทำให้ความยาวคงที่เราแนะนำปัญหา Y10K ที่นี่)


34
ในขณะที่คุณอาจล้อเล่นรหัสนี้อาจหลอกหลอนเราอย่างจริงจังใน 8000 ปี รหัสมีอายุการใช้งานนานกว่าที่ทุกคนคาดหวัง…😓
จงพ่ายแพ้

15
@deceze ISO8601 มีบทบัญญัติเป็นเวลา 5 ปีแล้ว แต่น่าสนใจที่จะเห็นว่าการใช้งาน DateTime ในปัจจุบันอนุญาตให้มี
Zac Faragher

4
@ZacFaragher ฉันแน่ใจว่าเราจะมีเวลาอีกมากที่จะใช้มันในภายหลังไม่จำเป็นต้องรีบใช่มั้ย ... ?
ilkkachu

51
@deceze ทำไมคุณถึงทำให้น้ำแข็งฉัน - คุณคิดวิธีการรักษาโรคมะเร็ง? ไม่เป็นปี 9999 และคุณรู้จักภาษาโคบอล
user3067860

6
คุณอาจต้องการแก้ไขการพิมพ์ผิดของคุณ คำว่าพันปีซึ่งเป็นพหูพจน์ของสหัสวรรษมีการสะกดคำแบบทวีคูณด้วย double-N เพื่อให้ตรงกับ double-N ในแต่ละปีจาก Latin annus เป็นเวลาหนึ่งปี เมื่อคุณสะกดคำผิดมันมีเพียงหนึ่งเดียว-N ตอนนี้มีความสุขตรงเดียว-N ของทวารหนักมาจากภาษาละตินทวารหนักมีความหมายเช่นเดียวคอรัสมันเป็นกีฬาภาษาอังกฤษ ในระยะสั้นคุณจะต้องสะกดมันในลักษณะที่หมายความว่าคุณกำลังพูดถึงพันปีไม่ใช่พันรู :)
tchrist

57

มีเหตุผลอะไรบ้าง?

ใช่. ชิ้นส่วนของซอฟต์แวร์เหล่านั้นจะใช้มาตรฐาน ISO 8601

ISO 8601 มีข้อดีกว่ารูปแบบวันที่อื่น:

  • มันเป็นมาตรฐานพร้อมกับเอกสารข้อมูลจำเพาะ :)
  • มันไม่คลุมเครือ mm / dd / yyyy และ dd / mm / yyyy อาจสร้างความสับสนเว้นแต่จะผ่านวันที่ 13
  • มันเรียงตามพจนานุกรมตามลำดับเวลาจากน้อยไปมากดังนั้นจึงไม่จำเป็นต้องใช้ตรรกะการเรียงลำดับวันที่พิเศษ สิ่งนี้มีประโยชน์อย่างยิ่งในชื่อไฟล์โดยที่การเรียงลำดับตัวเลขตามพจนานุกรมมักทำให้เกิดความสับสน (เช่น1_file, 10_file, 2_file)
  • มันสั่งปี 4 หลักและเดือนเบาะปีและศูนย์ สิ่งนี้หลีกเลี่ยงปัญหาปี 2000 และความกำกวมอื่น ๆ

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

สำหรับเหตุผลดูการแนะนำของspec

แม้ว่าข้อเสนอแนะและมาตรฐาน ISO ในสาขานี้มีให้บริการตั้งแต่ปีพ. ศ. 2514 รูปแบบการแสดงตัวเลขที่แตกต่างกันของวันที่และเวลามีการใช้งานทั่วไปในประเทศต่างๆ ในกรณีที่การเป็นตัวแทนดังกล่าวมีการแลกเปลี่ยนข้ามขอบเขตของประเทศการตีความที่ผิดเกี่ยวกับความสำคัญของตัวเลขสามารถเกิดขึ้นได้ทำให้เกิดความสับสนและข้อผิดพลาดหรือความสูญเสียที่เป็นผลสืบเนื่องอื่น ๆ จุดประสงค์ของมาตรฐานสากลนี้คือเพื่อขจัดความเสี่ยงจากการตีความที่ผิดและเพื่อหลีกเลี่ยงความสับสนและผลที่ตามมา

...

มาตรฐานระหว่างประเทศนี้ยังคงรักษานิพจน์ที่ใช้บ่อยที่สุดสำหรับวันที่และเวลาของวันและการแสดงของพวกเขาจากมาตรฐานสากลก่อนหน้านี้และให้ตัวแทนที่ไม่ซ้ำกันสำหรับการแสดงออกใหม่ที่ใช้ในการปฏิบัติ การประยุกต์ใช้ในการแลกเปลี่ยนข้อมูลโดยเฉพาะอย่างยิ่งระหว่างระบบประมวลผลข้อมูลและอุปกรณ์ที่เกี่ยวข้องจะขจัดข้อผิดพลาดที่เกิดขึ้นจากการตีความที่ผิดและค่าใช้จ่ายที่เกิดขึ้น การส่งเสริมมาตรฐานสากลนี้ไม่เพียง แต่จะช่วยอำนวยความสะดวกในการแลกเปลี่ยนข้ามขอบเขตระหว่างประเทศ แต่ยังจะปรับปรุงความสามารถในการพกพาของซอฟต์แวร์และจะช่วยลดปัญหาการสื่อสารภายในองค์กรและระหว่างองค์กรต่างๆ

มาตรฐานกำหนดรูปแบบ "พื้นฐาน" เพื่อลดการใช้ตัวคั่น ดังนั้นYYYYMMDDเป็นพื้นฐานYYYY-MM-DDสลับไปเป็นรูปแบบขยาย


4
ฉันไม่ทราบว่า ISO 8601 อนุญาต YYYYMMDD นอกเหนือจาก YYYY-MM-DD
keuleJ

iso.org/iso-8601-date-and-time-format.htmlดูเหมือนว่าจะระบุว่า "รูปแบบเพิ่มเติม" ของ YYYY-MM-DD เป็นรูปแบบเดียวสำหรับ 8601 หรือไม่
Oskar Austegard

3
@keuleJ การลดการใช้ตัวคั่นเช่น YYYYMMDD แทน YYYY-MM-DD นั้นเรียกว่าการจัดรูปแบบ "พื้นฐาน" ในมาตรฐาน ISO 8601
Basil Bourque

ประโยชน์อีกสองข้อของ ISO 8601: (a) ง่ายต่อการแยกวิเคราะห์ด้วยเครื่องจักรที่ไม่มีตัวอักษร SPACE และไม่มีข้อความที่แปลเป็นภาษาท้องถิ่นและ (b) ง่ายต่อการหยั่งรู้โดยมนุษย์ในหลายวัฒนธรรม และไม่มีการสมมติภาษาอังกฤษ
Basil Bourque

55

เป็นเพราะวิธีอื่น ๆ ทั้งหมดที่จะทำนั้นไม่ชัดเจน

01/02/2546 นั่นหมายความว่าอย่างไร สองมกราคม 2546? หรือในยุโรป: วันที่ 1 กุมภาพันธ์ 2003 มันยิ่งแย่ลงไปอีกถ้าคุณใช้เลขสองหลักสำหรับปีเช่น 01/02/46

นั่นคือเหตุผลที่คุณใช้ YYYYMMDD มันเป็นแบบแผนที่ช่วยให้เราสื่อสารอย่างชัดเจนเกี่ยวกับวันที่ 20030201 ตามวันที่ชัดเจนเสมอ (และทำให้การเรียงลำดับง่ายขึ้น)

(ตอนนี้อย่าไปเก็บมันไว้เป็นจำนวนเต็ม 20 ล้าน 30,000 2 แสนและ 1 ได้ไหม


14
"20030201 เป็นวันที่ชัดเจนเสมอ" : นั่นไม่ใช่กรณีอย่างแน่นอน มันคลุมเครือเช่นเดียวกับ "01/02/2546" เว้นแต่คุณจะรู้ว่า YYYYMMDD (หรือว่า YYYYDDMM หรือ DDMMYYYY? ... ) เป็นรูปแบบที่ใช้ คุณจำเป็นต้องทราบรูปแบบของวันที่เสมอ ไม่มี "การประชุม" ที่ทำให้สิ่งต่าง ๆ ชัดเจน
skomisa

6
@skomisa ที่ค่อนข้างไม่ถูกต้อง ISO 8601 กำหนดรูปแบบวันมาตรฐานสากลโดยเฉพาะเพื่อเหตุผลที่คุณระบุ ไม่มีรูปแบบอื่นใดเป็นรูปแบบวันที่ที่ถูกต้องและไม่มีมาตั้งแต่ 19880605
K. Alan Bates

11
@ K.AlanBates วันที่ของคุณไม่ชัดเจนเว้นแต่เราคิดว่าควรแยกวิเคราะห์ตาม ISO 8601
Goyo

16
20030201 คือวันที่ 20 มีนาคม 201AD ใช่ไหม
David Richerby

10
@Martijn แต่เฉพาะภาษา ในตุรกีเป็นŞubatมากกว่าเดือนกุมภาพันธ์ (ก่อนที่คุณจะคิดว่ารหัสของคุณใช้งานได้ให้ตรวจสอบที่ประเทศตุรกีเสมอ )
นิวแฮมป์เชียร์

19

ให้ t1 และ t2 เป็นจำนวนเต็มที่แตกต่างกันซึ่งแสดงถึงการเขียนสองครั้งในการจัดรูปแบบ YYYYMMDD จากนั้น t1 <t2 หมายความว่า t2 เกิดขึ้นหลังจาก t1

คุณสูญเสียการสั่งซื้อนี้ด้วยการจัดรูปแบบ DD และ MM ก่อน

ISO คือ IMO ซึ่งเป็นรูปแบบที่สมเหตุสมผลเท่านั้น


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

5
@pipe: เชื่อฉันบางคนจะ เรารักษาระบบเดิมที่เก็บ YYYYMMDD เป็นจำนวนเต็ม การออกแบบอาจมาจากระบบฐานข้อมูลเก่าบางระบบที่ไม่มีวันที่ชัดเจนและถูกเก็บไว้เพื่อความเข้ากันได้ย้อนหลัง มันไม่สวย อย่าทำมัน
Heinzi

19
@pipe มันเป็นประสบการณ์ของฉันในอุตสาหกรรมซอฟต์แวร์ที่เมื่อใดก็ตามที่คนที่เหมาะสมจะต้องการพูดว่า "แต่คุณจะไม่ทำ X" มีอย่างน้อยหนึ่งตัวอย่างที่เคาน์เตอร์
Joseph Rogers

5
@pipe ในการจัดเก็บข้อมูลไม่ใช่เรื่องแปลกที่จะใช้จำนวนเต็ม yyyymmdd เป็นคีย์หลัก / ตัวแทนสำหรับตารางวันที่
soapygopher

4
@pipe ทีนี้หมายเลขลำดับของโซน DNS เป็นจำนวนเต็ม 32 บิตซึ่งจะต้องเพิ่มขึ้นเมื่อโซนเปลี่ยนไป ในขณะที่มันอาจเป็นเพียงตัวเลขธรรมดา แต่สำนวนที่พบบ่อยคือการใช้ตัวเลขเช่น 2018092601 ... จากนั้นก็มีคำจำกัดความที่แปลกประหลาดบางอย่างของตัวเลขเวทย์มนตร์ตามที่อธิบายไว้ในfeature_test_macros(7)เช่นมี_POSIX_C_SOURCE > 200809Lวิธีการที่รองรับคุณสมบัติจาก POSIX.1-2008 ...
ilkkachu

12

จุดหนึ่งที่ไม่ได้กล่าวถึงคือในอินพุตแบบโต้ตอบรูปแบบนี้อนุญาตให้ควบคุมอินพุต

ระบบไม่สามารถทราบได้ว่าเดือนใดมี 28, 29, 30 หรือ 31 วันโดยไม่ทราบปีและเดือนที่ระบุ เมื่ออินพุทอินเทอร์แอคทีฟสั่งให้ปีและเดือนแรกมาก่อนสามารถตรวจสอบว่าวันที่ (แทรกครั้งสุดท้าย) อยู่ในช่วงที่อนุญาตหรือไม่

จริงอยู่คำถามส่วนใหญ่เกี่ยวกับรูปแบบวันที่ แต่สามารถโต้เถียงว่ารูปแบบวันที่เป็นไปตามการจัดรูปแบบที่นำเสนอให้กับผู้ใช้


7

คำสั่งซื้อ YYYYMMDD จะเป็นวันเดียวกับที่คุณสั่งซื้อหมายเลข: ส่วนที่สำคัญที่สุดก่อน MMDDYYYY จะเป็นเหมือนการเขียน "หนึ่งร้อยยี่สิบสาม" เป็น "ยี่สิบและหนึ่งร้อยสาม"

ในวัฒนธรรมของเราเรามีความเข้าใจตามธรรมชาติของ MMDDYYYY เพราะในฐานะมนุษย์เรามีความตระหนักในเรื่องของเวลา โดยทั่วไปเรารู้ว่ามันเป็นปี การดูปีไม่ค่อยสำคัญดังนั้นเราจึงผลักไปทางด้านหลัง เดือนเปลี่ยนไปเร็วพอที่จะรักษาความสำคัญของพวกเขา วัฒนธรรมอื่น ๆ จัดการกับสิ่งนี้ได้อย่างแตกต่างกัน โลกส่วนใหญ่ชอบ DDMMYYYY


62
คุณอาจต้องการใช้ถ้อยคำใหม่ "วัฒนธรรมของเรา" เพราะในวัฒนธรรมของฉันมันเป็น DDMMYYYY ดังนั้นจึงไม่ใช่วัฒนธรรม "ของเรา" เพียงของคุณ
slebetman

66
แผนที่ที่ครอบคลุมของทุกประเทศที่ใช้รูปแบบวันที่MMDDYYYY img-9gag-fun.9cache.com/photo/a2mXmGd_700b.jpg
Peregrine

9
ดูเหมือนอาร์กิวเมนต์แปลก ๆ : "เดือนเปลี่ยนไปเร็วพอที่จะรักษาความสำคัญของพวกเขา" -> ทำไมไม่ใส่วันแรกตั้งแต่เปลี่ยนเร็วขึ้น?
Wim Deblauwe

7
@JoelCoehoorn เป็นเรื่องง่ายที่จะทำให้ชัดเจน ("ในวัฒนธรรมของเรา") "เรา" / "เรา" มักใช้เพื่อหมายถึง "ชุมชน stackexchange" ที่นี่
AnoE

14
เผง Stackoverflow เป็นนานาชาติ การที่คุณเป็นคนอเมริกันไม่ได้บอกเป็นนัยหรือแม้แต่ทำให้คนอื่นเป็นอย่างนั้น คุณไม่สามารถทำการสันนิษฐานเกี่ยวกับท้องที่ของผู้อ่านของคุณที่นี่พวกเขาอยู่ทั่วโลก และผู้อ่านส่วนใหญ่ของคุณจะไม่ใช่คุณหรือ OP แต่เป็นคนอื่นที่ค้นหาคำตอบของคุณบน Google ความคิดเห็นนี้เขียนขึ้นในทวีปที่แตกต่างจากที่คุณเคยอาศัยอยู่ และในขณะที่เรามีของเราเอง - เอ๊ะ - นิสัยที่น่าสนใจแน่นอนที่สุดเราไม่ใช้ MM / DD / YYYY ที่นี่ ...
cmaster

6

มีการกล่าวถึงการเรียงลำดับ แต่ด้วยเหตุผลที่มีประโยชน์ที่สุดสำหรับการเปรียบเทียบคือ "สตริง" และใช่มีการสั่งเวลา 26 ตัวอักษรในทำนองเดียวกัน

ฉันรู้ว่าการเปรียบเทียบดังกล่าวมีความสำคัญสำหรับการเรียงลำดับ แต่โดยทั่วไปจะมีประโยชน์สำหรับการเรียงลำดับองค์ประกอบ 2 รายการ

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

การจัดรูปแบบสวยสำหรับฝั่งไคลเอ็นต์หรือการเรียงพิมพ์


5

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


4

มันเกี่ยวกับข้อ จำกัด ลองนึกภาพปีพารามิเตอร์เดือนและวันในรูปแบบ YYYYMMDD แต่ละพารามิเตอร์มีข้อ จำกัด มากขึ้นกว่าก่อนหน้านี้

ดังนั้นหากคุณต้องการที่จะค้นหาสิ่งที่เกิดขึ้นในปี 1970 คุณสามารถทำมันได้โดยการค้นหาสตริงเริ่มต้นโดยแต่ถ้าคุณจำซึ่งถูกเดือนคุณสามารถเพิ่มเดือนเช่น"1970*" "197005*"วิธีนี้ทุก "พารามิเตอร์" ของวันที่ให้ข้อมูลที่เฉพาะเจาะจงมากขึ้น

เป็นวิธีเดียวที่จะเปลี่ยนจากข้อมูลที่เฉพาะเจาะจงน้อยลง ( "1970*") ไปยังข้อมูลที่เฉพาะเจาะจงมากขึ้น ( "19700523")


3
ไม่ใช่ข้อโต้แย้งที่ยอดเยี่ยม - เป็นเรื่องธรรมดาที่จะค้นหาสิ่งต่าง ๆ ที่เกิดขึ้นในเดือนที่เฉพาะเจาะจงมากกว่าปีที่เฉพาะเจาะจง
ลูกบาศก์

1
ถ้า1970*และ197005*เป็นตัวแทนของ "glob ไวยากรณ์" ตัวแทนจากนั้นคุณสามารถค้นหาพวงของวัน MMDDYYYY โดยการค้นหาสำหรับ glob หรือ*1970 05*1970คำตอบของคุณอาจอนุมานถึงข้อ จำกัด เพิ่มเติมบางประการที่คุณไม่ได้กล่าวถึงอย่างชัดเจนและอาจปรับปรุงให้ดีขึ้นโดยอธิบายสมมติฐานของคุณ
Quuxplusone

3
นี่เป็นผลข้างเคียงหรือวิธีอื่นในการอธิบายลำดับการเรียงคีย์ที่กล่าวถึงโดยคำตอบอื่น ๆ แต่คำอธิบายนี้จะแยกออกจากกันเว้นแต่คุณจะ จำกัด ไว้เฉพาะการค้นหาคำนำหน้า (ง่ายต่อการจัดทำดัชนี แต่ไม่จำเป็นต้องทำ)
Peter Cordes

นอกจากนี้ยังหมายความว่าคุณสามารถเลือกลำดับของวันที่ด้วย regexp ที่ค่อนข้างง่าย ...
Harper

1

ทำไมในการเขียนโปรแกรมรูปแบบวันที่เริ่มต้นคือ YYYYMMDD ...

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

มากกว่าหนึ่งในสามของทุกภาษาโปรแกรมถูกพัฒนาขึ้นในประเทศที่มีภาษาอังกฤษเป็นภาษาหลักและส่วนใหญ่ของคนทันสมัยเป็นไปตามมาตรฐานของรายละเอียดบาง - มาตรฐานสากลสำหรับวันที่เป็นมาตรฐาน ISO 8601

ข้อมูลเพิ่มเติม: (TMI?)

เมื่อมีการเปลี่ยนแปลงเวลาโดยทั่วไปไปข้างหน้าวันที่เพิ่มขึ้นก่อนจากนั้นเดือนเดือนสุดท้าย - อาจเข้าใจได้ง่ายกว่าถ้าเรามีวันที่ทศนิยม (และเวลาทศนิยม ) - เมื่อเวลาผ่านไปจำนวนจะยิ่งใหญ่ขึ้น มันง่ายกว่าสำหรับมนุษย์ที่จะดูตัวเลขและเปรียบเทียบกับวันที่อื่นได้อย่างรวดเร็ว

คอมพิวเตอร์จะไม่สนใจสิ่งที่โครงสร้างที่คุณต้องการใช้และในที่สุด ( แต่ไม่ทั้งหมด ) คอมพิวเตอร์ตรรกะไบนารีจะใช้ - ฐานอีจริงมีเศรษฐกิจมุฎฐานที่ต่ำที่สุดแต่ไม่ได้เป็นส่วนใหญ่ที่มีประสิทธิภาพมิได้ที่ง่ายที่สุดสำหรับลำดับที่สมบูรณ์

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

การรู้ล่วงหน้าตั้งแต่ปีนั้นจะบอกจำนวนวันในหนึ่งปีความผันแปรที่ใหญ่ที่สุดในช่วงเวลาหนึ่งปีที่จะเกิดขึ้น มันจะบอกคุณตรงไปตรงมาจำนวนวันในแต่ละเดือนที่จะปฏิบัติตาม (สำหรับข้อผิดพลาดในการตรวจสอบในช่วงรายการ) อนุญาตให้ใส่ของวันแรกอาจจะต้องกลับคุณได้ถ้าปีต่อมาไม่เห็นด้วยกับการป้อนข้อมูลของคุณ - อาจจะทำให้สามารถเข้าถึงการป้อนข้อมูลยากขึ้น . นอกจากนี้ยังมีความสำคัญกับเรื่องที่เกี่ยวกับรูปแบบปฏิทิน ดูปฏิทิน geek ที่มีทศนิยม stardates

เท่าที่คอมพิวเตอร์มีความกังวลว่ามีแนวโน้มที่จะใช้เวลา UNIX Epochจำนวนวินาทีที่ผ่านไปตั้งแต่ 00:00:00 เวลาสากลเชิงพิกัด (UTC) วันพฤหัสบดีที่ 1 มกราคม 1970 ซึ่งทุกวันจะได้รับการปฏิบัติเสมือนว่ามี 86400 วินาทีต่อวินาที ดูวัน Julianด้วย รูปแบบ YYYYMMDD นั้นเป็นที่ต้องการเพียงอย่างเดียวโดยมนุษย์ที่เป็นคนไร้เดียงสา IAU ถือว่าหนึ่งปีเป็นปีจูเลียนที่ 365.25 วัน (31.5576 ล้านวินาที) เว้นแต่จะระบุไว้เป็นอย่างอื่น


1
จริง ๆ แล้วมนุษย์และซอฟต์แวร์ทุกชิ้นที่ฉันเคยพบเคยชอบรูปแบบอื่น
Goyo

1
ยินดีที่ได้รู้จัก! ฉันเดฟและฉันชอบ YYYYMMMM
วิศวกรที่กลับรายการแล้ว

0

การใช้งานอื่นที่ฉันเห็นสำหรับการแสดงนี้คือคุณสามารถเก็บวันที่เป็นจำนวนเต็ม (เช่นในฐานข้อมูล) โดยใช้เพียง 4 ไบต์ต่อวัน การใช้ YYYYMMDD นั้นหมายความว่าการเปรียบเทียบจำนวนเต็ม (มักจะเป็นคำสั่งเครื่องเดียว) มีผลเช่นเดียวกับการเปรียบเทียบวันที่ที่เป็นตัวแทน และมันพิมพ์ได้ในระดับปานกลางที่มนุษย์อ่านได้ และสิ่งเหล่านี้ไม่ต้องการรหัสหรือการสนับสนุนพิเศษใด ๆ เลยในสภาพแวดล้อมการเขียนโปรแกรมหลัก

หากสิ่งเหล่านั้นเป็นสิ่งที่คุณจำเป็นต้องทำกับวันที่และคุณต้องทำมันมากแล้วรูปแบบนี้มีการอุทธรณ์มากมาย

โดยการเปรียบเทียบวันที่ในรูปแบบทั่วไปเช่น DD / MM / YYYY ใช้เวลา 10 ไบต์เป็นสตริงของอักขระ ASCII YYYYMMDD สตริงลดที่ 8 และได้รับประโยชน์ "เปรียบเทียบการเป็นตัวแทนมีผลเช่นเดียวกับการเปรียบเทียบวันที่" แต่แม้แล้วการเปรียบเทียบตามสตริงเป็นตัวอักษรโดยตัวละครมากกว่าการเปรียบเทียบจำนวนเต็มเดียว


2
มันง่ายมากที่จะแพ็ควันที่เป็นสามไบต์ ช่วง 0000 ~ 9999 ต้องการ 14 บิต, 01 ~ 12 ต้องการ 4 บิตและ 01 ~ 31 ต้องการ 5 บิตรวมเป็น 23 บิต ด้วยการใช้บิตที่เหลือในปริมาณสามไบต์คุณสามารถแสดงวันที่ในช่วงเวลา 32,768 ปีที่ยังคงความละเอียดในหนึ่งวัน ตัวอย่างนี้สามารถใช้ตัวอย่างเช่นเพื่ออนุญาตให้แสดงวันที่ในช่วงปี 8191 BC ถึง 24576 AD โดยการบรรจุบิตเป็น, พูด, yyyyyyyyyyyyyymmmmddddd, การแทนทศนิยมยังคงเทียบเท่าโดยตรง (แม้ว่าจะไม่ใช่มนุษย์โดยตรงสามารถอ่านได้ แต่ใครสนใจในการจัดเก็บทางกายภาพฐานข้อมูล?)
CVN

0

เหตุผลเดียวกับที่ดวงจันทร์ทำมาจากชีสสีเขียว: ไม่ใช่ ในกรณีส่วนใหญ่รูปแบบเริ่มต้นคือสตริงแปลบางชนิด บางครั้งใช้รูปแบบ ISO แต่มักจะมีขีดกลางเพื่อให้อ่านง่ายขึ้น YYYYMMDD(หรือ%Y%m%dในการstrftimeพูดจา) เป็นค่าเริ่มต้นไม่ค่อย เพื่อความเป็นธรรมฉันแน่ใจว่าฉันเห็นมัน แต่ฉันไม่สามารถนึกถึงตัวอย่างได้ในขณะนี้

วันที่ Unix (โปรแกรมอรรถประโยชน์หลักของ GNU)

date

เอาท์พุท:

Wed Sep 26 22:20:57 CEST 2018

หลาม

import time
print(time.ctime())

เอาท์พุท:

Wed Sep 26 22:27:20 2018

C

#include <stdio.h>
#include <time.h>

int main () {
   time_t curtime;

   time(&curtime);
   printf(ctime(&curtime));
   return(0);
}

เอาท์พุท:

Wed Sep 26 22:40:01 2018

C ++

#include <ctime>
#include <iostream>

int main()
{
    std::time_t result = std::time(nullptr);
    std::cout << std::ctime(&result);
}

เอาท์พุท:

Wed Sep 26 22:51:22 2018

จาวาสคริ

current_date = new Date ( );
current_date;

เอาท์พุท:

Wed Sep 26 2018 23:15:22 GMT+0200 (CEST)

SQLite

SELECT date('now');

เอาท์พุท:

2018-09-26

Lotus Symphony Spreadsheets

ป้อนคำอธิบายรูปภาพที่นี่

Gnumeric

ป้อนคำอธิบายรูปภาพที่นี่

OnlyOffice

ป้อนคำอธิบายรูปภาพที่นี่

Python + จำนวนมาก

import numpy as np
pd.datetime64('now')

เอาท์พุท:

numpy.datetime64('2018-09-26T21:31:55')

Python + pandas

import pandas as pd
pd.Timestamp('now', unit='s')

เอาท์พุท:

Timestamp('2018-09-26 21:47:01.277114153')

วิศวกรรมซอฟต์แวร์

ป้อนคำอธิบายรูปภาพที่นี่

apport.log

ERROR: apport (pid 9742) Fri Sep 28 17:39:44 2018: called for pid 1534, signal 6, core limit 0, dump mode 2

alternatives.log

update-alternatives 2018-05-08 15:14:24: run with --quiet --install /usr/bin/awk awk /usr/bin/mawk 5 --slave /usr/share/man/man1/awk.1.gz awk.1.gz /usr/share/man/man1/mawk.1.gz --slave /usr/bin/nawk nawk /usr/bin/mawk --slave /usr/share/man/man1/nawk.1.gz nawk.1.gz /usr/share/man/man1/mawk.1.gz

ถ้วย / access.log

localhost - - [28/Sep/2018:16:41:58 +0200] "POST / HTTP/1.1" 200 360 Create-Printer-Subscriptions successful-ok

syslog

Sep 28 16:41:46 pop-os rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="946" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

10
ในการเพิ่มอาร์กิวเมนต์ของคุณมีการจัดรูปแบบจำนวนเท่าใดเนื่องจากการตั้งค่าผู้ใช้บนคอมพิวเตอร์ที่คุณเรียกใช้ scrip
Topher Brink

คนแรกไม่ใช่ "bash" จริงๆมันเป็นโปรแกรมวันที่ (และออกDo 27. Sep 22:27:09 CEST 2018ที่นี่)
Paŭlo Ebermann

@ PaŭloEbermannคุณพูดถูกฉันหวังว่าตอนนี้จะดีขึ้นแล้ว ดังที่ฉันกล่าวว่ารูปแบบเหล่านี้มีการแปลเป็นภาษาท้องถิ่นดังนั้นรูปแบบที่แท้จริงที่คุณเห็นจะขึ้นอยู่กับตัวเลือกการแปลของคุณ
Goyo

3
ในขณะที่ประเด็นของคำตอบนี้เป็นจริงสำหรับแอพสำหรับผู้ใช้ปลายทาง แต่ไม่ใช่สำหรับการแลกเปลี่ยนข้อมูลระหว่างระบบการทำให้เป็นอนุกรมของข้อมูลโปรโตคอลข้อความ / ข้อมูลการบันทึกการสืบค้นกลับการดีบักและอื่น ๆ มาตรฐาน ISO 8601 กำลังกลายเป็นบรรทัดฐานสำหรับการใช้งานดังกล่าวอย่างมุ่งเป้าไปที่ผู้ดูแลระบบและโปรแกรมเมอร์ เหมือนกันสำหรับสถานการณ์ระหว่างประเทศหรือสถานที่เกิดเหตุไม่เชื่อเรื่องพระเจ้า
Basil Bourque

@BasilBourque ขอบคุณฉันเพิ่มตัวอย่างสุ่มของบันทึกที่ฉันพบในระบบของฉันเอง ฉันไม่มีตัวอย่างประเภทอื่นที่มีประโยชน์ แต่ฉันไม่คิดว่าแนวโน้มต่อการเริ่มต้นมาตรฐาน ISO 8601 ในโดเมนที่เฉพาะเจาะจงทำให้ตัวแปรพื้นฐาน "เริ่มต้นในการเขียนโปรแกรม" ในหน้าของซอฟต์แวร์จำนวนมากที่เริ่มต้นในรูปแบบอื่น ๆ
Goyo

-1

ประโยชน์เพิ่มเติมที่ไม่ได้กล่าวถึงก็คือปริมาณที่ต้องการ (การกำหนดค่าที่แม่นยำว่าเป็นของช่วงทั่วไปของค่า) เป็นการดำเนินการที่ค่อนข้างง่ายและรวดเร็ว ..

สมมติว่าคุณกำลังเขียนรายงานที่สรุปเหตุการณ์วันนี้เช่นยอดรวมและจำนวนการขาย วันที่และเวลาขายจะถูกเก็บไว้เป็น YYYYMMMMDDHHMISS คุณเพียงแค่ต้องเก็บอักขระ 8 ตัวที่เหลืออยู่ (ถ้าเป็นสตริง) หรือหารจำนวนเต็ม (เช่นชั้น) 1,000,000 เพื่อลดเวลาในการขายของคุณ

ในทำนองเดียวกันถ้าคุณต้องการยอดขายของเดือนคุณเก็บเพียง 6 หลักทางซ้ายสุดหรือหารด้วย 100,000,000

แน่นอนคุณสามารถยืนยันได้ว่าการจัดการสตริงใด ๆ เป็นไปได้ datetime สำหรับการขาย "12-25-2018 12:34 pm" อาจถูกซับสตริงและจัดการหลายครั้งเพื่อรับเดือนและปี ในรูปแบบตัวเลข 122520181234 สามารถแบ่งและ modded และคูณและหารเพิ่มเติมและในที่สุดก็ผลิตเดือนและปี .. .. แต่รหัสจะยากที่จะเขียนอ่านรักษาและเข้าใจ ..

และแม้กระทั่งเครื่องมือเพิ่มประสิทธิภาพฐานข้อมูลที่ซับซ้อนอาจไม่สามารถใช้ดัชนีในคอลัมน์สำหรับส่วนคำสั่งหากรูปแบบวันที่เป็น MM / DD / YYYY แต่ตัดและแยกส่วนกลับมารวมกัน ในการเปรียบเทียบการจัดเก็บการเป็นตัวแทน YYYYMMDD และการต้องการธันวาคม 2018 นำไปสู่การที่ส่วนคำสั่งของ ILK dateasstring LIKE '201812%'หรือdateasint BETWEEN 20181200 and 20181299- บางสิ่งบางอย่างดัชนีสามารถใช้สำหรับ

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

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