Excelの日付コードを「日付」に変換します


15

負でない整数のExcelスタイルの日付コードを指定すると、年、月、および「日」を明確に示す適切な形式で、対応する「日付」を返します。

些細なことだと思うかもしれません。「恐怖の引用」に気づきましたか?Excelにはいくつかの癖があるため、これらを使用しました。Excelは1月1日のために番号1の日数をカウントST、1900、しかし1900年1月0を持っていたかのように目の 2月29日およびthは、そのすべてのテストケースを試すために非常に注意してください:

 Input → Output (example format)
     0 → 1900-01-00    Note: NOT 1899-12-31
     1 → 1900-01-01
     2 → 1900-01-02
    59 → 1900-02-28
    60 → 1900-02-29    Note: NOT 1900-03-01
    61 → 1900-03-01
   100 → 1900-04-09
  1000 → 1902-09-26
 10000 → 1927-05-18
100000 → 2173-10-14

1
ないすべての年は、2月の1月と29日の0を持っているかだけ異常1900ですか?
シャギー

4
1900は異常です。Excelは、1900(うるう年ではない)を除き、うるう年を正しく処理します。しかし、それはバグが発生したLotus 1-2-3との互換性のためでした。
リックヒッチコック

3
@RickHitchcockどうやら、Lotus 1-2-3開発者はうるう年のコードを節約するためにそれを行ったため、ルールは4年ごとに単純になりました。正当な理由もあります。1900年は過去のものでしたが、2100年もそうです。
アダム

3
@RickHitchcockオリジナルのLotus 1-2-3がY2Kを処理できなかった可能性が非常に高いため、Microsoftはその1つの問題を模倣することを決定しましたが、それ以外はそのままです。ところで、上のレガシー生活:.NETのOADateはエポック1899-12-持つ30を、それはすべてが、1900年の最初の2ヶ月間にエクセルと整列するようには、しかし、これは必要DayOfWeek1899年12月30日、元エポックための方法を(または架空の1900-01-00)は、平日が単に日番号のmod-7になるように選択されましたが、1899-12-30では機能しません。
アダム

4
Excelの日付に関する「理由」の背後にあるストーリーは次のとおりです。ソフトウェアに関するJoel:My First BillG Review。有益な(そして面白い)読み。
BradC

回答:


13

Excel、3(+7?)

=A1

フォーマット付き

yyy/m/d

純粋なポート


もちろん、出力形式はロケールによって異なる場合があります。
アダム

2
これはWindows版Excelでのみ機能します。Mac版Excelには、1900年ではなく1904年の日付で始まる番号システムがあります。テストケースの一部である1900年の日付は報告されません。これがWindows用のExcelであることを指定することができます。
キータ-モニカを

1
@Keeta Excel for Macでこれを機能させるには、設定で[ 1904日付システムを使用]のチェックを外すだけです。
BradC

1
@BradC trueですが、プログラムのデフォルト構成への変更はまったく問題ありませんが、答えに含める必要があります。これを答えを改善するためのポイントとしてコメントします。名前をExcel for Windowsに切り替えるか、警告を追加するか、OpenOffice Calcに切り替える(または、意図的にバグが含まれているため、同様の)と言います。 codegolf.meta.stackexchange.com/questions/10037/...
Keeta -モニカ復活

6

k(kdb + 3.5)、55 54 51 50バイト

{$(`1900.01.00`1900.02.29,"d"$x-36526-x<60)0 60?x}

テストするには、次の行をqコンソールに貼り付けます。

k)-1@{$(`1900.01.00`1900.02.29,"d"$x-36526-x<60)0 60?x}'0 1 2 59 60 61 100 1000 10000 100000;

出力は

1900.01.00
1900.01.01
1900.01.02
1900.02.28
1900.02.29
1900.03.01
1900.04.09
1902.09.26
1927.05.18
2173.10.14

{ } 引数付きの関数です x

0 60?x指標xの中で0 60または2が見つからない場合

ˋ1900.01.00ˋ1900.02.29 2つのシンボルのリスト

, それに追加する

"d"$ 日付に変換

x-36526 1900年からの日数(デフォルトの2000年ではなく)

- x<60 Excelのリープエラーを調整する

(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)@ 0 60?x並置は索引付けを意味します-中央の「@」は暗黙的です

$ 文字列に変換


1
kの異なるバージョン(k5 / k6、私は思う)では、動作する{$[x;$`d$x-65746;"1900.01.00"]} ようです。どこかで何かがあふれていると思い100000ます。
-zgrep

@zgrep Kのバージョンは基本的にまったく異なる言語なので、投稿する必要があります。
アダム


3

JavaScript(ES6)、 89 82  77バイト

保存された 7  12は@tshのおかげでバイト

n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')

オンラインでお試しください!


n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
tsh

@tshそれは確かにはるかに優れています。ありがとう。(また、このアプローチは何とかゴルフできるのではないかと思います。)
アーナルド

私はちょうどnew Date(0,0,1)と同じであることがわかりますnew Date(1900,0,1)。したがって、remove 190は3バイトを節約します。そして
...-tsh

2
77バイト:n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
tsh

GMT0 / -xで実行する必要がありますか?
l4m2



1

APL(Dyalog Classic)、31バイト

匿名の暗黙の接頭辞関数。日付を返します[Y,M,D]

3↑×-60∘≠)+32NQ#263,60∘>+⊢-×

オンラインでお試しください!

× 日付コードのサイン

⊢- 引数(日付コード)からそれを引きます

60∘>+ 日付コードが60を超える場合に増分

2⎕NQ#263, それを「イベント263」の即時引数として使用します(現在のIDN)
ます

3↑ その最初の3つの要素を取ります(4番目は曜日です)

()+ それらに以下を追加します。

60∘≠ 日付コードが60の場合は0。日付コードが60でない場合は1

×- 日付コードの符号からそれを引きます

¯3↑ 最後の3つの要素(1つしかない)を(2つの)ゼロでパディングする

@Adámとチャットで開発




0

T-SQL、141 95 94バイト

SELECT IIF(n=0,'1/0/1900',IIF(n=60,'2/29/1900',
FORMAT(DATEADD(d,n,-IIF(n<60,1,2)),'d')))FROM i

改行は読みやすくするためのものです。

入力は、既存のテーブルを経由して取得され、私は、整数フィールドでnは私たちのIO規格ごと

SQLは、内部日付形式に同様の(ただし修正された)1-1-1900開始点を使用するため、DATEADD関数で1日または2日だけオフセットする必要があります。

SQLは、日付と文字の値が混在した列を出力できないため、FORMATコマンドを終了することはできません(1/0/1900日付に変換しようとするため、もちろん無効です)。

SQLの良い点は、すべての入力値をテーブルにロードして、一度にすべて実行できることです。私(米国)の地域はデフォルトでm/d/yyyy日付形式になっています:

n       output
0       1/0/1900
1       1/1/1900
2       1/2/1900
59      2/28/1900
60      2/29/1900
61      3/1/1900
100     4/9/1900
1000    9/26/1902
10000   5/18/1927
43432   11/28/2018
100000  10/14/2173

編集IIF()はるかに冗長ではなく、入れ子に変更することにより、46バイトを保存しましたCASE WHEN

EDIT 2:移動することによって、別のバイトを保存-する前にIIF

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.