web-dev-qa-db-ja.com

プログラミングにおいて、デフォルトの日付形式がYYYYMMDDであり、他のものではない技術的な理由はありますか?

なぜそのようになっているのですか?たとえば、「年」は「月」よりも具体的であるため、RDBMSの場合はパフォーマンスと関係があるのではないかと思っていました。たとえば、2000年は1年しかありませんが、毎年「1月」があります。これにより、最初に年ごとに何かをフィルタリング/ソートすることがより簡単/高速になります。そのため、その年が最初に来ます。

しかし、それが本当に理にかなっているのかはわかりません...何か理由があるのでしょうか?

123
lucaswxp

このようにして、日付は文字列として簡単にソートできますデフォルトのソートルールを使用して(つまり 辞書式ソート )。

これは、月と日が2桁で指定される理由でもあります(必要に応じて、先行ゼロを追加します)。

実際、これは ISO 8601 で定義されている日付形式の1つです。この標準は、日付と時刻の形式2015-03-27T15:26:40Zも定義しています。これは文字列としてもソートできます。

ただし、YYYYMMDDには、文字列を整数として解析し、簡単に(部分文字列や文字の置換は必要ありません)解析できるという追加の利点があります。

387

まだ言及していませんが、注文はすぐにわかりますinside YYYY。それはすでに数千年、数世紀、数十年、数年です。つまり、YYYYはすでに最長期間から最短期間に注文されています。同じことがMMとDDにも当てはまります。これが、数値システムの仕組みです。

したがって、順序betweenフィールドを順序withinフィールドと一致させるために、唯一のオプションはYYYYMMDDです。

ZahbazとArseni Mourzenkoが指摘したように、YYYYMMDD形式は簡単に並べ替えられます。これは幸運な偶然ではありません。これは、最長の期間のフィールドを最初に置くことの直接の結果です(そして長さを固定したままにします。ここでは、Y10K問題を導入しています)。

135
MSalters

何か理由はありますか?

はい。これらのソフトウェアは ISO 8601 を使用します。

ISO 8601には、他の日付形式に比べて多くの利点があります。

  • これは、スペックドキュメントの標準です:)
  • それは明白です。 mm/dd/yyyyとdd/mm/yyyyは、13日を過ぎていないと混乱する可能性があります。
  • 辞書式に時間の昇順でソートされるため、特別な日付ソートロジックは必要ありません。これは、辞書式の数値ソートがしばしば混乱するファイル名で特に役立ちます(例:1_file, 10_file, 2_file)。
  • 4桁の年とゼロが埋め込まれた月と年が必須です。これにより、2000年問題やその他のあいまいさが回避されます。

whyISO 8601が最初に存在するのは、国/システム間でデータを交換するときに、日付形式が曖昧で混乱しているためです。明確なものが必要でした。

根拠については spec の紹介を参照してください。

この分野のISO勧告と規格は1971年から利用可能ですが、日付と時刻の数値表現のさまざまな形式がさまざまな国で一般的に使用されています。そのような表現が国境を越えて交換される場合、数字の重要性の誤解が発生し、混乱やその他の結果として生じるエラーまたは損失を引き起こす可能性があります。この国際規格の目的は、誤解のリスクを排除し、混乱とその結果を回避することです。

...

この国際標準は、日付と時刻に最も一般的に使用される表現と以前の国際標準からの表現を保持し、実際に使用されるいくつかの新しい表現に独自の表現を提供します。特にデータ処理システムと関連機器の間の情報交換におけるそのアプリケーションは、誤解から生じるエラーとそれらが生成するコストを排除します。この国際標準の推進により、国際的な境界を越えた交換が容易になるだけでなく、ソフトウェアの移植性も向上し、組織内および組織間の通信の問題が緩和されます。

この規格では、「基本的な」バリエーションを区切り文字の使用を最小限に抑えることと定義しています。したがって、YYYYMMDDbasicであり、拡張形式YYYY-MM-DD

57
Pod

それを行う他のすべての方法があいまいだからです。

2003/02/01それはどういう意味ですか? 2003年1月2日?またはヨーロッパ:2003年2月1日? 01/02/03のように、年に2桁を使用すると、さらに悪化します。

そのため、YYYYMMDDを使用します。これは、日付が常に明確であるため、20030201で日付について明確に通信できるようにするための規則です。 (そしてそれはソートを容易にします)

(これを、整数2000万30万2000として保存しないでください。大丈夫ですか?かなりください?)

55
Pieter B

T1とt2を、YYYYMMDD形式で記述された2回を表す別個の整数とする。次に、t1 <t2は、t2がt1の後に発生したことを意味します。

DDおよびMMの最初のフォーマットでは、この順序が失われます。

ISOは、IMO、唯一の賢明なフォーマットです。

19
zahbaz

言及されていない1つの点は、対話型入力では、この形式で入力を制御できることです。

システムは、特定の年と月がわからなければ、1か月が28、29、30、または31日であるかどうかを知ることができません。インタラクティブな入力でその年と月が最初に来るように要求された場合、その日(最後に挿入された)が許容範囲内にあるかどうかを確認できます。

確かに、質問は主に日付形式に関するものでしたが、日付形式はユーザーに提示された形式に従うと主張できます。

12
Martin

YYYYMMDD注文の日付は、数値を注文するのと同じ方法で、最も重要な部分が最初です。 MMDDYYYYは、「120 23」を「20と130」と書くようなものです。

私たちの文化では、MMDDYYYYを自然に理解しています。なぜなら、人間として、私たちは時間を認識しており、年がゆっくりと進んでいるからです。私たちは一般的にそれが何年かを知っています。年を見ることはめったに重要ではないので、私たちはそれを後ろに押します。月は、その重要性を保持するのに十分な速さで切り替わります。他の文化はこれを異なって扱います。世界の多くはDDMMYYYYを好みます。

7
Joel Coehoorn

並べ替えについて説明しましたが、これを実行する最も有用な理由は、それらを「文字列」として比較することであり、26文字のタイムスタンプも同様に並べられます。

そのような比較はソートに不可欠であることは承知していますが、2要素のソートには一般的に役立ちます。

私はこれが採用されなかったプロジェクトに取り組みました、そしてはい、プログラマーは(混合結果で)日付を文字列として比較しようとしました。

かなりのフォーマットは、クライアント側または組版用です。

6
mckenzm

この形式では、文字列のアルファベット順が日付の時系列順と同じになります。多くのツールは、アルファベット順などを提供するため、これは便利です。ファイルを名前で指定しますが、ファイル名から任意にフォーマットされた日付を解析し、それらで並べ替える方法はありません。

5
WolfgangGroiss

それは制限についてです。 YEAR、MONTH、DAYをパラメータとして、YYYYMMDDの形式で各パラメータが前のパラメータよりも制限されていると想像してください。

したがって、1970年に起こった何かを検索したい場合は、"1970*"で始まる文字列を検索することで検索できますが、月を覚えている場合は"197005*"のように月を追加できます。このように、日付のすべての「パラメータ」は、より具体的な情報を提供します。

これは、あまり具体的でない情報("1970*")からより具体的な情報("19700523")に移行する唯一の方法です。

4
mrvinent

プログラミングで、デフォルトの日付形式がYYYYMMDDである理由...

人間が読める形式の入力と出力であり、必ずしもそのように格納されているわけではありません。

すべてのプログラミング言語の3分の1以上 は、英語を主言語とする国で開発され、現代の言語のほとんどは、いくつかの説明の標準に準拠しています-日付の国際標準は ISO 8601 です。

詳細:(TMI?)

時間の変化に応じて、通常は日数が最初に増加し、次に月、最後に年数が増加します- 10進数の日付 (および 10進数の時間 ))があると、時間が経つにつれて数値が大きくなることを理解しやすくなります。人間が数字を見て、一目で別の日付と比較する方が簡単です。

コンピュータは、どの構造を使用するかを気にしませんほとんどの場合(ただし すべてではない )コンピュータ バイナリロジック が使用されます-ベースeは、実際には 基数経済が最も低い ですが、最も 効率的 でもない) 完全なシーケンス

実際の入力と出力 日付の形式は国によって異なります および ローカリゼーション によって設定されますが、YYYYMMDDは最も意味があり、慣れているようです は普遍的ではありません 今日も 過去の最長期間はそうではありません ですが、今日でも ローマ数字日付に一般的に使用されます です。

先行する年を知ることで、1年の日数がわかります。最大の 期間の変動 が1年で受けることができます。これにより、毎月の日数を前もって知ることができます(入力時のエラーチェック用)。最初の日の入力を許可すると、翌年が入力に同意しなかった場合にバックアップが必要になる可能性があります。これにより、 アクセス可能 入力がより困難になります。 カレンダー形式 に関しても重要です。を参照してください。また、 オタクカレンダー 、10進数のスターデイト付き。

コンピュータに関する限り、 NIXエポック時間 、毎日が扱われる1970年1月1日木曜日の00:00:00協定世界時(UTC)から経過した秒数)を使用する可能性があります。ちょうど86400秒を含むかのように。 ユリウス日 も参照してください。YYYYMMDD形式は自我中心の人間に好まれ、 IAUは1年をユリウス年と見なします 365.25日(31.5576百万秒)特に指定されていません。

1
Rob

この表現で私が見たもう1つの用途は、日付ごとに4バイトだけを使用して、日付を整数として(つまり、データベースに)格納できることです。 YYYYMMDDを使用すると、整数の比較(多くの場合、単一の機械命令)が、表された日付の比較と同じ結果になります。そして、適度に人間が読めるように印刷します。また、メインストリームのプログラミング環境では、コードや特別なサポートは一切必要ありません。

それらが日付で行う必要があることのほとんどであり、多くのことを行う必要がある場合、この形式は非常に魅力的です。

比較すると、DD/MM/YYYYのような一般的な形式の日付は、ASCII文字の文字列として10バイトを必要とします。YYYYMMDD文字列はそれを8に減らし、「表現を比較すると比較と同じ結果になります。日付」の利点がありますが、それでも文字列ベースの比較は、単一の整数比較ではなく、文字ごとの比較です。

0
Ben

月がグリーンチーズで作られているのと同じ理由:それはそうではありません。ほとんどの場合、デフォルトの形式はある種のローカライズされた文字列です。 ISO形式が使用されることもありますが、通常は読みやすくするためにダッシュを使用します。 YYYYMMDD(または%Y%m%d in strftime parlance)がデフォルトになることはほとんどありません。公平を期すために、私はそれを見たと確信していますが、今の例を考えることはできません。

Unixの日付(GNUコアユーティリティ)

date

出力:

Wed Sep 26 22:20:57 CEST 2018

Python

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

Javascript

current_date = new Date ( );
current_date;

出力:

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

SQLite

SELECT date('now');

出力:

2018-09-26

LibreOffice Calc

enter image description here

数値

enter image description here

OnlyOffice

enter image description here

Python + numpy

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

出力:

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

Python +パンダ

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

出力:

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

ソフトウェアエンジニアリング

enter image description here

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

cups/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
0