Excel 날짜 코드를 "날짜"로 변환


15

음수가 아닌 정수 Excel 스타일 날짜 코드가 제공되면 연도, 월 및 "일"을 명확하게 나타내는 적절한 형식으로 해당 "날짜"를 반환하십시오.

사소한 생각합니다. "무서운 따옴표"를 보셨습니까? Excel에는 몇 가지 단점이 있기 때문에 사용했습니다. 엑셀 년 1 월 1 일에 대한 번호가 1 인 일을 세는 , 1900 만, 1900 년 1 월 0을 가진 것처럼 2 월 29 일이 , 그래서 모든 테스트 케이스를 시도하는 것은 매우 조심 :

 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 월의 0 번째와 29이 있거나 만 이상 1900?
Shaggy

4
1900 년은 예외입니다. Excel은 윤년이 아닌 1900을 제외하고 윤년을 올바르게 처리합니다 . 그러나 버그가 발생한 Lotus 1-2-3과의 호환성을위한 것이 었습니다.
Rick Hitchcock

3
@RickHitchcock 분명히 Lotus 1-2-3 개발자는 윤년 코드를 절약하여 규칙이 단순히 4 년마다 바뀌도록했습니다. 정당한 이유도 있습니다. 1900 년은 과거에 있었고 2100 년은 한참 됐습니다.
Adám

3
@RickHitchcock 원래 Lotus 1-2-3이 Y2K를 처리 할 수 ​​없었기 때문에 Microsoft는이 한 가지 문제를 모방하기로 결정했지만 그렇지 않은 경우에는 그대로 유지합니다. BTW에 기존의 삶 : .NET의 OADate는 시대 1899-12-이 (30) 는, 모든 엑셀하지만 1900 년 처음 두 개월 그러나이 필요로를 줄 것이다 그래서 DayOfWeek방법 원래의 시대, 1899-12-30 있기 때문에 (또는 가상의 1900-01-00)은 요일이 단순히 요일 번호의 mod-7이되도록 선택되었지만 1899-12-30에서는 작동하지 않습니다.
Adám

4
Excel 날짜에 대한 "이유"에 대한 이야기는 다음과 같습니다. Joel on Software : My First BillG Review . 유익하고 재미있는 읽기.
BradC

답변:


14

엑셀, 3 (+7?)

=A1

형식으로

yyy/m/d

순수한 포트


출력 형식은 물론 지역에 따라 다를 수 있습니다.
Adám

2
이것은 Windows 용 Excel에서만 작동합니다. Mac 용 Excel에는 1900이 아닌 1904 년 날짜로 시작하는 숫자 시스템이 있습니다. 1900 년에는 테스트 사례의 일부인 날짜가보고되지 않습니다. 이것이 Windows 용 Excel임을 지정할 수 있습니다.
Keeta-복원 Monica Monica

1
@Keeta Mac 용 Excel에서 작동하려면 환경 설정에서 "1904 날짜 시스템 사용"을 선택 해제하십시오 .
BradC

1
@BradC 사실이지만 프로그램의 기본 구성 변경은 완벽하게 적용되지만 정답은 포함되어야합니다. 나는 이것을 대답을 향상시키기위한 요점으로 언급한다. Windows 용 Excel로 이름을 바꾸거나 경고를 추가하거나 OpenOffice Calc로 전환하거나 의도적으로 버그를 포함했기 때문에 유사하다고 말할 수 있습니다. codegolf.meta.stackexchange.com/questions/10037/…
Keeta-Monica 복원

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찾을 수없는 경우 x0 60또는 2의 색인

ˋ1900.01.00ˋ1900.02.29 두 개의 기호 목록

, 그것에 추가

"d"$ 날짜로 변환

x-36526 1900 년 이후의 일 수 (기본 2000 대신)

- x<60 엑셀의 도약 오류에 맞게 조정

(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)@ 0 60?xjuxtaposition은 인덱싱을 의미합니다. 중간의 "@"는 암시 적입니다.

$ 문자열로 변환


1
다른 버전의 k (k5 / k6, 생각합니다)의 경우 {$[x;$`d$x-65746;"1900.01.00"]} 작동하는 것 같습니다 . 에 어딘가에 무언가가 넘친다 고 가정합니다 100000.
zgrep

@zgrep K 버전은 기본적으로 완전히 다른 언어이므로 게시해야합니다.
Adám


3

자바 스크립트 (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 정말 좋습니다. 감사. (또한 이 접근법 이 어떻게 든 골프화 될 수 있을지 의문이다.)
Arnauld

나는 단지 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

2

클린 , 205 189 바이트

import StdEnv
a=30;b=31;c=1900;r=rem
@m=sum(take m(?c))
?n=[b,if(n>c&&(r n 4>0||r n 100<1&&r n 400>0))28 29,b,a,b,a,b,b,a,b,a,b: ?(n+1)]
$n#m=while(\m= @m<n)inc 0-1
=(c+m/12,1+r m 12,n- @m)

온라인으로 사용해보십시오!


1
기본 제공 날짜 처리를 사용하지 않는 첫 번째 답변. 좋은!
Adám


1

APL (Dyalog Classic) , 31 바이트

익명의 암묵적 접두사 기능. 날짜를[Y,M,D]

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

온라인으로 사용해보십시오!

× 날짜 코드의 부호

⊢- 인수에서 날짜 빼기 (날짜 코드)

60∘>+ 날짜 코드가 60을 초과하면 증가

2⎕NQ#263, "이벤트 263"(IDN에서 현재까지)
IDN은 Excel의 날짜 코드와 비슷하지만 1900 년 2 월 29 일은없고 1900 년 1 월 1 일 전날은 1899 년 12 월 31 일입니다.

3↑ 그것의 처음 세 요소를 취하십시오 (네번째는 요일입니다)

()+ 다음을 추가하십시오.

60∘≠ 날짜 코드가 60이면 0; 날짜 코드가 60이 아닌 경우 1

×- 날짜 코드의 부호에서 빼기

¯3↑ 마지막 두 요소 (하나만 있음)를 0으로 채우십시오.

채팅 에서 @ 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.

편집 2 :의 -앞에 이동하여 다른 바이트를 저장 했습니다 IIF.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.