Có bất kỳ lý do kỹ thuật tại sao, trong lập trình, định dạng ngày mặc định là YYYYMMDD và không phải cái gì khác không?


118

Có bất kỳ lý do kỹ thuật tại sao nó như vậy? Tôi đã tự hỏi trong trường hợp RDBMS rằng nó có liên quan đến hiệu suất, vì "NĂM" cụ thể hơn "THÁNG", chẳng hạn: bạn chỉ có một năm 2000, nhưng mỗi năm có "tháng 1", điều này sẽ giúp việc lọc / sắp xếp thứ gì đó theo năm đầu tiên dễ dàng hơn và nhanh hơn và đó là lý do năm đến trước.

Nhưng tôi không biết điều đó có thực sự có ý nghĩa không ... Có lý do nào không?


14
@IMil Chúng tôi có thể không thích nó, nhưng khá thường xuyên chúng được lưu trữ dưới dạng chuỗi.
Honza Brabec

14
@candied_orange Điều đó thật lạ, đặc biệt là trong trường hợp ngày.
glglgl


19
Như một lưu ý phụ, định dạng này không phải xa lạ. Ví dụ, trong ngôn ngữ Hungary (và có lẽ một số người khác nữa) YYYY. MM. DD. là định dạng ngày viết mặc định và đã có từ rất lâu trước khi máy tính.
Neinstein

31
Trong lập trình, định dạng ngày mặc định là "YYYYMMDD"? Sẽ thật tuyệt nếu điều đó là sự thật, nhưng đó chắc chắn không phải là trường hợp ở mọi nơi. RFC 822 và RFC 850, cũng như ANSI C asctime, vẫn được sử dụng rộng rãi ở nhiều nơi. Thật tuyệt khi RFC 3339 và ISO 8601 đang dần thay thế các định dạng cũ hơn và chúng chắc chắn là những gì nên được sử dụng trong tương lai. Tổng quát hơn, tôi sẽ nói rằng mẫu cơ bản ISO 8601 (YYYYMMDD đơn giản không có ký tự phân tách) thực sự ít phổ biến hơn một số dạng khác, như YYYY-MM-DD.
Daniel Pryden

Câu trả lời:


386

Bằng cách này, ngày có thể dễ dàng được sắp xếp dưới dạng chuỗi bằng cách sử dụng quy tắc sắp xếp mặc định (nghĩa là sắp xếp từ vựng ).

Đây cũng là lý do tại sao cả tháng và ngày được chỉ định sử dụng hai chữ số (thêm số 0 đứng đầu nếu cần).

Trong thực tế, đây là một trong những định dạng ngày được xác định bởi ISO 8601 . Tiêu chuẩn đó cũng xác định định dạng ngày và thời gian, 2015-03-27T15:26:40Zcũng có thể sắp xếp thành chuỗi.

Tuy nhiên, YYYYMMDD có một lợi ích bổ sung là làm cho nó có thể dễ dàng (không thay thế ký tự hoặc thay thế ký tự) phân tích chuỗi dưới dạng một số nguyên và vẫn sử dụng thứ tự mặc định trên các số nguyên.


90
@lucaswxp: Nếu bạn viết một so sánh trường hợp đặc biệt cho các chuỗi theo một lược đồ cụ thể, tất nhiên bạn có thể làm cho nó thành baroque như bạn muốn. Điều ở đây là lược đồ được thiết kế sao cho thứ tự từ vựng (cũng như thứ tự nhận biết số từ vựng) cũng là thứ tự logic, do đó không cần tùy chỉnh.
Ded repeatator

19
@lucaswxp Chuỗi ngày của bạn có thể không có trong bộ nhớ. Ví dụ thực tế: Bạn có một tệp csv đã được sắp xếp theo ngày ISO và hàng triệu + hàng mỗi năm. Và bạn muốn chỉ trả lại các hàng giữa các ngày nhất định. Bạn có thể đọc từng dòng tệp theo từng dòng (từng hàng) cho đến khi bạn đạt được ngày đầu tiên, sau đó tải các hàng vào bộ nhớ cho đến khi bạn đạt đến ngày cuối cùng. Bạn có thể bỏ qua phần còn lại của tập tin. Nhưng nếu bạn lưu ngày dưới dạng một số định dạng khác hoặc chỉ được sắp xếp theo năm, bạn sẽ phải đọc máng toàn bộ hồ sơ trị giá cả năm trước khi đóng tệp.
Tom A. Vibeto

48
Lưu ý rằng dấu gạch ngang là tùy chọn trong ISO 8601, vì vậy YYYYMMDD ISO 8601.
Martin Ba

32
@Benoit Một đề xuất đã được đưa ra để giải quyết vấn đề Y10K. Nếu chúng ta vẫn đang sử dụng cùng thời đại, thì chúng ta sẽ đi đến AYYYYYMMDD cho đến Y100K, đó sẽ là BYYYYYYMMDD, CYYYYYYYMMDD, DYYYYYYYYMMMM, EYYYYYYYYYMMDD. Tiền tố alpha hàng đầu này đảm bảo thứ tự sắp xếp chính xác (với điều kiện "A0YYYY ..." v.v ... là các đại diện không hợp lệ nếu bất kỳ ngày YYYY ... nào vẫn được sử dụng). Tại một số thời điểm khi số chữ số năm chia hết cho ba, chúng ta sẽ bắt đầu thêm ba chữ số mỗi lần thay đổi tiền tố alpha, để đảm bảo chúng ta không hết chữ trước cái chết nóng của vũ trụ.
Monty Harder

35
Điều quan trọng cần lưu ý là với định dạng này, việc sắp xếp không chỉ "dễ dàng hơn". Sắp xếp từ vựng (dựa trên ký tự) trở nên tương đương với sắp xếp theo thời gian, có nghĩa là bạn có thể sắp xếp theo thời gian mà không cần phân tích cú pháp .
jpmc26

135

Chưa được đề cập, nhưng bạn nhanh chóng theo dõi thứ tự bên trong YYYY. Đó đã là thiên niên kỷ, hàng thế kỷ, thập kỷ, năm. Điều đó có nghĩa là, YYYY đã được đặt hàng từ thời gian dài nhất đến thời gian ngắn nhất. Điều tương tự cũng xảy ra với MM và DD, đó là cách hệ thống số hoạt động.

Vì vậy, để giữ thứ tự giữa các trường phù hợp với thứ tự trong các trường, tùy chọn duy nhất là YYYYMMDD.

Như zahbaz và Arseni Mourzenko đã lưu ý, các định dạng YYYYMMDD sắp xếp dễ dàng. Đó không phải là sự trùng hợp may mắn, đó là hậu quả trực tiếp của việc đặt các trường trong thời gian dài nhất trước tiên (và giữ độ dài cố định; chúng tôi đang giới thiệu một vấn đề Y10K ở đây.)


34
Trong khi bạn có thể nói đùa, mã này có thể nghiêm trọng đến ám ảnh chúng ta sau 8000 năm. Mã sống lâu hơn bất cứ hy vọng ... 😓
deceze

15
@deceze ISO8601 đã có quy định cho một năm gồm 5 chữ số, nhưng thật thú vị khi xem triển khai DateTime nào hiện đang cho phép.
Zac Faragher

4
@ZacFaragher, tôi chắc chắn chúng ta sẽ có nhiều thời gian để thực hiện điều đó sau này, không cần phải vội vàng, phải không ...?
ilkkachu

51
@deceze Tại sao bạn làm phiền tôi - bạn đã tìm ra cách chữa ung thư chưa? Không, đó là năm 9999 và bạn biết COBOL.
dùng3067860

6
Bạn có thể muốn sửa lỗi đánh máy của bạn. Từ millennia , số nhiều của thiên niên kỷ , được đánh vần là một chữ N để ghép với chữ N kép hàng năm từ annus Latin trong năm. Khi bạn viết sai chính tả chỉ bằng một chữ N, giờ đây nó không phù hợp với chữ N của hậu môn từ hậu môn Latinh có ý nghĩa tương tự như từ mượn của nó trong thể thao tiếng Anh. Nói tóm lại, bạn luôn cần đánh vần nó theo cách có nghĩa là bạn đang nói về hàng ngàn năm chứ không phải hàng ngàn lỗ mông. :)
tchrist

57

Có bất kỳ lý do nào không?

Đúng. Những phần mềm đó sẽ được sử dụng ISO 8601 .

ISO 8601 có một số lợi thế so với các định dạng ngày khác:

  • Đó là một tiêu chuẩn với một tài liệu đặc tả :)
  • Nó không rõ ràng. mm / dd / yyyy và dd / mm / yyyy có thể gây nhầm lẫn trừ khi quá ngày thứ 13.
  • Nó sắp xếp theo từ vựng theo thứ tự thời gian tăng dần, do đó không yêu cầu logic sắp xếp ngày đặc biệt. Điều này đặc biệt hữu ích trong tên tệp, trong đó việc sắp xếp số từ vựng thường gây nhầm lẫn (ví dụ 1_file, 10_file, 2_file).
  • Nó bắt buộc năm 4 chữ số và không đệm tháng và năm. Điều này tránh được vấn đề năm 2000 và những điều mơ hồ khác.

Về lý do tại sao ISO 8601 tồn tại ở nơi đầu tiên, đó là vì mọi người đang tìm thấy các định dạng ngày mơ hồ và khó hiểu khi hoán đổi dữ liệu giữa các quốc gia / hệ thống và họ cần một cái gì đó không rõ ràng.

Để biết lý do, hãy xem phần giới thiệu của thông số kỹ thuật .

Mặc dù Khuyến nghị và Tiêu chuẩn ISO trong lĩnh vực này đã có sẵn từ năm 1971, các hình thức biểu diễn số ngày và thời gian khác nhau đã được sử dụng phổ biến ở các quốc gia khác nhau. Trường hợp các đại diện như vậy được hoán đổi qua biên giới quốc gia giải thích sai về tầm quan trọng của các chữ số có thể xảy ra, dẫn đến nhầm lẫn và các lỗi hoặc mất mát do hậu quả khác. Mục đích của Tiêu chuẩn quốc tế này là để loại bỏ nguy cơ giải thích sai và tránh sự nhầm lẫn và hậu quả của nó.

...

Tiêu chuẩn quốc tế này giữ lại các biểu thức được sử dụng phổ biến nhất cho ngày và thời gian trong ngày và các biểu diễn của chúng từ các tiêu chuẩn quốc tế trước đó và cung cấp các biểu diễn duy nhất cho một số biểu thức mới được sử dụng trong thực tế. Ứng dụng của nó trong trao đổi thông tin, đặc biệt là giữa các hệ thống xử lý dữ liệu và thiết bị đi kèm sẽ loại bỏ các lỗi phát sinh do giải thích sai và các chi phí mà chúng tạo ra. Việc thúc đẩy Tiêu chuẩn quốc tế này sẽ không chỉ tạo điều kiện trao đổi qua các ranh giới quốc tế, mà còn cải thiện tính di động của phần mềm và sẽ giảm bớt các vấn đề giao tiếp trong một tổ chức, cũng như giữa các tổ chức.

Tiêu chuẩn xác định các biến thể cơ bản của Viking là giảm thiểu việc sử dụng các dấu phân cách. Vì vậy, YYYYMMDDlà thay thế cơ bản cho định dạng mở rộng YYYY-MM-DD.


4
Tôi không biết rằng ISO 8601 cũng cho phép YYYYMMDD bên cạnh YYYY-MM-DD.
keuleJ

iso.org/iso-8601-date-and-time-format.html dường như chỉ ra rằng "Định dạng mở rộng" của YYYY-MM-DD là định dạng duy nhất cho 8601?
Oskar Austegard

3
@keuleJ Tối thiểu hóa việc sử dụng các dấu phân cách như YYYYMMDD thay vì YYYY-MM-DD được gọi là biến thể định dạng cơ bản của Drake trong tiêu chuẩn ISO 8601.
Basil Bourque

Hai lợi ích nữa của ISO 8601: (a) Dễ phân tích bằng máy không có ký tự SPACE và không có văn bản địa phương hóa, và (b) Dễ dàng giao tiếp với con người qua các nền văn hóa với năm đầu tiên dễ nhận ra (nếu hiện đại), và không giả sử ngôn ngữ tiếng Anh.
Basil Bourque

55

Đó là bởi vì tất cả các cách khác để làm điều đó là mơ hồ.

01/02/2003 điều đó có nghĩa là gì? Tháng 1 năm 2003? Hay ở châu Âu: ngày 1 tháng 2 năm 2003? Nó thậm chí còn tồi tệ hơn nếu bạn sử dụng hai chữ số trong năm, là 01/02/03.

Đó là lý do tại sao bạn sử dụng YYYYMMDD, đó là quy ước cho phép chúng tôi liên lạc rõ ràng về ngày, 20030201 vì ngày luôn rõ ràng. (và nó làm cho nó dễ dàng hơn để sắp xếp)

(Bây giờ đừng đi lưu trữ dưới dạng số nguyên 20 triệu 30 nghìn 2 trăm và 1. vui lòng ok? Làm ơn vui lòng?)


14
"20030201 như một ngày luôn luôn rõ ràng" : Điều đó hoàn toàn không phải là trường hợp. Nó chỉ mơ hồ như "01/02/2003" trừ khi bạn biết rằng YYYYMMDD (hoặc đó là YYYYDDMM hoặc DDMMYYYY? ...) là định dạng đang được sử dụng. Bạn LUÔN cần biết định dạng của ngày; không có "quy ước" nào khiến mọi thứ trở nên rõ ràng.
skomisa

6
@skomisa mà không đúng lắm. ISO 8601 xác định định dạng ngày tiêu chuẩn quốc tế cụ thể cho các lý do bạn đã nêu. Không có định dạng nào khác là định dạng ngày hợp lệ và chưa có từ 19880605
K. Alan Bates

11
@ K.AlanBates Ngày của bạn không rõ ràng trừ khi chúng tôi cho rằng nó nên được phân tích cú pháp theo ISO 8601.
Goyo

16
20030201 là ngày 20 tháng 3 năm 201AD, phải không?
David Richerby

10
@Martijn, nhưng ngôn ngữ cụ thể. Ở Thổ Nhĩ Kỳ, đó là Şubat thay vì tháng 2 (Trước khi bạn nghĩ mã của mình hoạt động, hãy luôn kiểm tra Thổ Nhĩ Kỳ ).
NH.

19

Đặt t1 và t2 là các số nguyên riêng biệt đại diện cho hai lần được viết theo định dạng YYYYMMDD. Khi đó t1 <t2 ngụ ý rằng t2 xảy ra sau t1.

Bạn mất thứ tự này với định dạng đầu tiên DD và MM.

ISO là, IMO, định dạng hợp lý duy nhất.


1
Ngoại trừ bạn sẽ không bao giờ lưu trữ số này dưới dạng số nguyên, ít nhất là tôi chưa bao giờ nhìn thấy nó và cũng không xem xét nó.
đường ống

5
@pipe: Tin tôi đi, một số người sẽ làm. Chúng tôi duy trì một hệ thống kế thừa lưu trữ YYYYMMDD dưới dạng số nguyên. Thiết kế có thể bắt nguồn từ một số hệ thống cơ sở dữ liệu cũ mà không có loại ngày rõ ràng và được giữ để tương thích ngược. Nó không đẹp. Đừng làm điều đó.
Heinzi

19
@pipe Đó là kinh nghiệm của tôi trong ngành công nghiệp phần mềm rằng bất cứ khi nào một người hợp lý muốn nói "Nhưng bạn sẽ không bao giờ làm X" thì luôn có ít nhất một ví dụ phản biện
Joseph Rogers

5
@pipe Trong kho dữ liệu, không có gì lạ khi sử dụng số nguyên yyyymmdd làm khóa chính / thay thế cho bảng ngày.
xà phòng

4
@pipe, tốt, số thứ tự của vùng DNS là số nguyên 32 bit, phải tăng khi vùng thay đổi. Mặc dù có thể chỉ là một số đơn giản, một thành ngữ phổ biến là sử dụng các số như 2018092601 ... Sau đó, có một số định nghĩa tò mò về các số ma thuật được mô tả trong feature_test_macros(7), như có _POSIX_C_SOURCE > 200809Lnghĩa là các tính năng từ POSIX.1-2008 được hỗ trợ ...
ilkkachu

12

Một điểm không được đề cập là, trong các đầu vào tương tác, định dạng này cho phép kiểm soát đầu vào.

Hệ thống không thể biết nếu một tháng có 28, 29, 30 hoặc 31 ngày mà không biết năm và tháng cụ thể. Khi đầu vào tương tác bắt buộc năm đó và tháng đến trước, nó có thể kiểm tra xem ngày (được chèn cuối cùng) có nằm trong phạm vi cho phép hay không.

Cấp, câu hỏi chủ yếu là về định dạng ngày, nhưng có thể lập luận rằng định dạng ngày tuân theo định dạng được trình bày cho người dùng.


7

Các đơn đặt hàng YYYYMMDD ngày giống như cách bạn đặt hàng số: phần quan trọng nhất trước tiên. MMDDYYYY sẽ giống như viết "một trăm hai mươi ba" là "hai mươi mốt trăm".

Trong nền văn hóa của chúng tôi, chúng tôi có một sự hiểu biết tự nhiên về MMDDYYYY bởi vì, là con người, chúng tôi có nhận thức về thời gian và nhiều năm tiến triển chậm. Chúng ta thường biết đó là năm nào. Nhìn thấy năm hiếm khi có vấn đề, vì vậy chúng tôi đẩy nó trở lại. Tháng thay đổi chỉ đủ nhanh để giữ tầm quan trọng của họ. Các nền văn hóa khác xử lý điều này khác nhau. Phần lớn thế giới thích DDMMYYYY.


62
Bạn có thể muốn viết lại "văn hóa của chúng tôi" bởi vì trong nền văn hóa của tôi, đó là DDMMYYYY vì vậy đó không phải là "văn hóa" của chúng tôi chỉ là của bạn
slebetman

66
Bản đồ toàn diện của tất cả các quốc gia sử dụng định dạng ngày MMDDYYYY img-9gag-fun.9cache.com/photo/a2mXmGd_700b.jpg
Peregrine

9
Có vẻ như một cuộc tranh cãi kỳ lạ: "Tháng thay đổi chỉ đủ nhanh để duy trì tầm quan trọng của chúng" -> Tại sao không đặt ngày đầu tiên vì điều đó thay đổi nhanh hơn?
Wim Deblauwe

7
@JoelCoehoorn, thật dễ dàng để làm cho điều đó rõ ràng ("Trong văn hóa Hoa Kỳ của chúng tôi"). "Chúng tôi" / "chúng tôi" thường được dùng để chỉ "cộng đồng stackexchange" ở đây.
AnoE

14
Chính xác. Stackoverflow là quốc tế . Rằng bạn ở Mỹ không nói, ngụ ý hay thậm chí làm cho nhiều khả năng người khác cũng như vậy. Bạn không thể đưa ra bất kỳ giả định nào về địa phương của độc giả của bạn ở đây, họ ở khắp nơi trên thế giới. Và hầu hết độc giả của bạn sẽ không phải là bạn, cũng không phải OP, mà là những người khác tìm thấy câu trả lời của bạn trên Google. Chính nhận xét này được viết trên một lục địa khác với nơi mà bạn tình cờ sống. Và trong khi chúng ta có thói quen của riêng mình - ehm - những thói quen thú vị , chắc chắn chúng ta không sử dụng MM / DD / YYYY ở đây ...
cmaster

6

Sắp xếp đã được đề cập nhưng cho đến nay, lý do hữu ích nhất để làm là so sánh chúng là "chuỗi" và có một dấu thời gian 26 ký tự được sắp xếp tương tự.

Tôi biết rằng sự so sánh như vậy rất cần thiết cho việc sắp xếp, nhưng nó thường hữu ích cho việc sắp xếp 2 yếu tố.

Tôi đã làm việc trên các dự án mà điều này không được thông qua, và vâng, các lập trình viên đã thử (với kết quả hỗn hợp) để so sánh ngày dưới dạng chuỗi.

Định dạng đẹp là dành cho phía khách hàng hoặc sắp chữ.


5

Định dạng này làm cho thứ tự chữ cái của các chuỗi giống hệt với thứ tự thời gian của ngày. Điều này rất hữu ích vì nhiều công cụ cung cấp thứ tự chữ cái của các tệp ví dụ theo tên, nhưng không có cách nào phân tích các ngày được định dạng tùy ý từ tên tệp và sắp xếp theo các tệp đó.


4

Đó là về sự hạn chế. Hãy tưởng tượng NĂM, THÁNG và NGÀY là các tham số, ở định dạng YYYYMMDD, mỗi tham số bị hạn chế hơn so với tham số trước đó.

Vì vậy, nếu bạn muốn tìm kiếm một cái gì đó đã xảy ra vào năm 1970, bạn có thể làm điều đó bằng cách tìm kiếm một chuỗi bắt đầu bằng "1970*", nhưng nếu bạn nhớ lại tháng nào, bạn có thể thêm tháng như thế nào "197005*". Bằng cách này, mọi "thông số" của ngày cung cấp cho bạn thông tin cụ thể hơn.

Đó là cách duy nhất để đi từ thông tin ít cụ thể hơn ( "1970*") đến thông tin cụ thể hơn ( "19700523").


3
Không thực sự là một cuộc tranh luận tuyệt vời - nó chỉ phổ biến để tìm kiếm những thứ xảy ra trong những tháng cụ thể thay vì những năm cụ thể.
Khối

1
Nếu 1970*197005*đại diện cho cú pháp ký tự đại diện "toàn cầu", thì bạn có thể tìm kiếm một loạt các ngày MMDDYYYY bằng cách tìm kiếm toàn cầu *1970hoặc 05*1970. Câu trả lời của bạn có thể mặc nhiên thừa nhận một số ràng buộc bổ sung mà bạn không đề cập rõ ràng và có thể được cải thiện bằng cách giải thích giả định của bạn.
Quuxplusone

3
Đây là một loại hiệu ứng phụ hoặc một cách khác để mô tả thứ tự khóa sắp xếp được đề cập bởi các câu trả lời khác. Nhưng lời giải thích này sụp đổ trừ khi bạn hạn chế tìm kiếm trên các tiền tố. (Dễ dàng hơn để lập chỉ mục cho, nhưng không có nghĩa là bắt buộc).
Peter Cordes

Điều đó cũng có nghĩa là bạn có thể chọn một chuỗi ngày với regrec tương đối đơn giản ...
Harper

1

Tại sao, trong lập trình, định dạng ngày mặc định là YYYYMMDD ...

Đây là định dạng có thể đọc được của con người cho đầu vào và đầu ra, nó không nhất thiết phải được lưu trữ theo cách đó.

Hơn một phần ba tất cả các ngôn ngữ lập trình được phát triển ở một quốc gia có tiếng Anh là ngôn ngữ chính và hầu hết các ngôn ngữ hiện đại tuân thủ Tiêu chuẩn của một số mô tả - Tiêu chuẩn quốc tế cho ngày là ISO 8601 .

Thông tin thêm: (TMI?)

Khi thời gian thay đổi, thường là chuyển tiếp, ngày tăng trước, sau đó là tháng, năm cuối - có thể dễ hiểu hơn nếu chúng ta có ngày thập phân (và thời gian thập phân ) - khi thời gian trôi qua con số sẽ lớn hơn. Con người dễ dàng nhìn vào con số hơn và so sánh nó với một ngày khác trong nháy mắt.

Máy tính không quan tâm cấu trúc nào bạn muốn sử dụng và trong hầu hết (nhưng không phải tất cả ) logic nhị phân của máy tính được sử dụng - cơ sở e thực sự có nền kinh tế cơ số thấp nhất nhưng không hiệu quả nhất cũng như dễ nhất cho một chuỗi hoàn chỉnh .

Định dạng đầu vào và đầu ra thực tế cho ngày thay đổi theo quốc gia và được đặt theo địa phương hóa , trong khi YYYYMMDD dường như có ý nghĩa nhất và là những gì bạn đã quen với nó không phổ biến ngày nay, cũng không phải là như vậy trong quá khứ thời gian dài nhất, tuy nhiên ngay cả ngày nay chữ số La Mã được sử dụng phổ biến cho những ngày .

Biết trước năm cho bạn biết số ngày trong một năm, sự thay đổi lớn nhất trong thời gian mà một năm có thể trải qua. Nó cho bạn biết trước số ngày trong mỗi tháng để theo dõi (để kiểm tra lỗi trong khi nhập), cho phép đầu vào của ngày đầu tiên có thể phải sao lưu nếu năm sau không đồng ý với đầu vào của bạn - có thể khiến việc nhập có thể truy cập trở nên khó khăn hơn . Nó cũng có tầm quan trọng đối với định dạng lịch . Xem thêm lịch geek , với stardates thập phân của nó.

Theo như máy tính có liên quan, nó có khả năng sử dụng thời gian UNIX Epoch , số giây đã trôi qua kể từ 00:00:00 Giờ quốc tế phối hợp (UTC), Thứ Năm, ngày 1 tháng 1 năm 1970, trong đó mỗi ngày được xử lý như thể nó chứa chính xác là 86400 giây. Xem thêm ngày Julian . Định dạng YYYYMMDD được người bình thường ưa thích, IAU coi một năm là năm Julian là 365,25 ngày (31,5576 triệu giây) trừ khi có quy định khác.


1
Trên thực tế hầu hết mọi người và phần mềm tôi từng gặp đều thích một số định dạng khác.
Goyo

1
Hân hạnh được gặp bạn! Tôi là Dave và tôi thích YYYYMMDD
Kỹ sư đảo ngược

0

Một cách sử dụng khác mà tôi đã thấy cho đại diện này là bạn có thể lưu trữ ngày dưới dạng số nguyên (nghĩa là trong cơ sở dữ liệu), chỉ sử dụng 4 byte mỗi ngày. Sau đó, sử dụng YYYYMMDD có nghĩa là so sánh số nguyên (thường là một lệnh máy đơn) có kết quả tương tự như so sánh vào ngày được biểu thị. Và nó in vừa phải con người dễ đọc. Và không ai trong số này yêu cầu bất kỳ mã hoặc hỗ trợ đặc biệt nào, trong bất kỳ môi trường lập trình chính thống nào.

Nếu những điều đó là hầu hết những gì bạn cần làm với ngày, và bạn cần phải làm rất nhiều thứ, thì định dạng này có rất nhiều hấp dẫn.

Để so sánh, ngày ở các định dạng phổ biến như DD / MM / YYYY lấy 10 byte làm chuỗi ký tự ASCII. Các chuỗi YYYYMMDD giảm xuống còn 8 và đạt được lợi thế "so sánh các biểu diễn có kết quả tương tự như so sánh các ngày", nhưng ngay cả khi đó so sánh dựa trên chuỗi là từng ký tự thay vì so sánh một số nguyên.


2
Thật đơn giản để gói một ngày thành ba byte. Phạm vi 0000 ~ 9999 yêu cầu 14 bit, 01 ~ 12 yêu cầu 4 bit và 01 ~ 31 yêu cầu 5 bit, tổng cộng là 23 bit. Bằng cách sử dụng bit còn lại với số lượng ba byte, bạn có thể biểu thị ngày trong khoảng thời gian 32.768 năm duy trì độ phân giải một ngày. Điều này có thể được sử dụng, ví dụ, để cho phép đại diện cho các ngày trong khoảng năm 8191 trước Công nguyên đến năm 24576 sau Công nguyên. Bằng cách đóng gói các bit như, giả sử, yyyyyyyyyyyyyymmmmddddd, biểu diễn thập phân vẫn có thể so sánh trực tiếp (mặc dù không thể đọc trực tiếp ở người, nhưng ai quan tâm đến việc lưu trữ vật lý cơ sở dữ liệu?).
một CVn

0

Lý do tương tự Mặt trăng được làm bằng phô mai xanh: không phải vậy. Trong hầu hết các trường hợp, định dạng mặc định là một số loại chuỗi cục bộ. Đôi khi định dạng ISO được sử dụng nhưng thường có dấu gạch ngang để dễ đọc hơn. YYYYMMDD(hoặc %Y%m%dtrong strftimecách nói) là hiếm khi mặc định. Để công bằng tôi chắc chắn tôi đã nhìn thấy nó nhưng tôi không thể nghĩ ra một ví dụ ngay bây giờ.

Ngày Unix (tiện ích lõi GNU)

date

Đầu ra:

Wed Sep 26 22:20:57 CEST 2018

Con trăn

import time
print(time.ctime())

đầu ra:

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

Đầu ra:

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

Đầu ra:

Wed Sep 26 22:51:22 2018

Javascript

current_date = new Date ( );
current_date;

Đầu ra:

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

SQLite

SELECT date('now');

Đầu ra:

2018-09-26

LibreScript Calc

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

Gnumeric

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

Chỉ có

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

Python + numpy

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

Đầu ra:

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

Python + gấu trúc

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

Đầu ra:

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

Kỹ thuật phần mềm

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

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

lựa chọn thay thế.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

ly / access.log

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

nhật ký hệ thống

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
để thêm vào đối số của bạn, có bao nhiêu trong số chúng được định dạng theo cách đó do cài đặt của người dùng trên máy tính mà bạn đã chạy đoạn mã trên?
Topher Brink

Chương trình đầu tiên không thực sự "bash", đó là chương trình ngày (và nó xuất ra Do 27. Sep 22:27:09 CEST 2018ở đây.)
Paŭlo Ebermann

@ PaŭloEbermann Bạn nói đúng, tôi hy vọng nó tốt hơn bây giờ. Như tôi đã nói, nhiều định dạng này được bản địa hóa nên định dạng thực tế bạn thấy sẽ phụ thuộc vào các tùy chọn bản địa hóa của bạn.
Goyo

3
Mặc dù quan điểm của Câu trả lời này là đúng đối với các ứng dụng hướng đến người dùng cuối, nhưng không phải như vậy đối với việc trao đổi dữ liệu giữa các hệ thống, tuần tự hóa dữ liệu, giao thức tin nhắn / dữ liệu, ghi nhật ký, theo dõi, gỡ lỗi, v.v. Tiêu chuẩn ISO 8601 đang nhanh chóng trở thành tiêu chuẩn cho việc sử dụng như vậy nhằm vào các quản trị viên hệ thống và lập trình viên. Ditto cho các kịch bản quốc tế hoặc địa phương.
Basil Bourque

@BasilBourque Cảm ơn, tôi đã thêm một mẫu ngẫu nhiên các bản ghi tôi tìm thấy trong hệ thống của riêng tôi. Tôi không có ví dụ về các loại khác tiện dụng. Nhưng tôi không nghĩ rằng xu hướng mặc định thành ISO 8601 trong các miền cụ thể làm cho biến thể cơ bản của nó trở thành "mặc định trong lập trình" khi đối mặt với số lượng lớn phần mềm mặc định cho các định dạng khác.
Goyo

-1

Một lợi ích bổ sung không được đề cập cho đến nay là lượng tử hóa mong muốn (gán một giá trị chính xác thuộc cùng một phạm vi giá trị chung) là một hoạt động đơn lẻ tương đối dễ dàng và nhanh chóng ..

Giả sử bạn đang viết một báo cáo tóm tắt các sự kiện ngày hôm nay, như tổng và số lượng bán hàng. Ngày và thời gian bán được lưu trữ dưới dạng YYYYMMDDHHMISS, bạn chỉ cần giữ 8 ký tự ngoài cùng bên trái (nếu đó là một chuỗi) hoặc chia số nguyên (tức là sàn) cho 1.000.000 để giảm thời gian của bạn đến ngày bán.

Tương tự, nếu bạn muốn doanh số của tháng, bạn chỉ giữ 6 chữ số ngoài cùng bên trái hoặc chia cho 100.000.000

Chắc chắn, bạn có thể lập luận rằng bất kỳ thao tác chuỗi nào đều có thể, thời gian bán hàng của "12-25-2018 12:34 chiều" có thể được xâu chuỗi và thao tác nhiều lần để có được tháng và năm. Ở dạng số 122520181234 có thể được chia và sửa đổi, nhân lên, và chia thêm một số, và cuối cùng cũng tạo ra một tháng và một năm .. .. nhưng mã sẽ rất khó để viết, đọc, duy trì và hiểu ..

Và ngay cả các trình tối ưu hóa cơ sở dữ liệu tinh vi cũng có thể không thể sử dụng một chỉ mục trên một cột cho mệnh đề where nếu biểu mẫu ngày là MM / DD / YYYY nhưng được cắt lại và ghép lại với nhau. Để so sánh, việc lưu trữ một đại diện YYYYMMDD và muốn tháng 12 năm 2018 dẫn đến nơi các mệnh đề của ilk dateasstring LIKE '201812%'hoặc dateasint BETWEEN 20181200 and 20181299- một thứ mà một chỉ mục có thể dễ dàng được sử dụng cho

Do đó, nếu không có kiểu dữ liệu chuyên dụng cho ngày và biểu diễn chuỗi / số là lựa chọn duy nhất, thì việc sử dụng và lưu trữ thời gian trong một số biểu diễn của khoảng thời gian dài nhất trên khoảng thời gian từ trái sang ngắn nhất quyền có khá nhiều lợi ích để dễ hiểu, thao tác, lưu trữ, truy xuất và bảo trì mã

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.