Unix 타임 스탬프에 대한 Excel 날짜


85

누구든지 Excel 날짜를 올바른 Unix 타임 스탬프로 변환하는 방법을 알고 있습니까?


"엑셀 날짜"란 무엇을 의미합니까? 다음과 같이 사람이 읽을 수있는 날짜-시간 문자열로 형식이 지정된 텍스트를 의미 "11/09/2009 3:23:24 PM"합니까?
— Matt Ball

4
2038 년 1 월 19 일에 Unix Time Stamp가 32 비트 오버 플로우로 인해 작동을 멈출 것임을 잊지 마십시오. 이 순간이되기 전에 수백만 개의 응용 프로그램이 타임 스탬프에 대한 새로운 규칙을 채택하거나 타임 스탬프를 "비트"더 많이 구입하는 64 비트 시스템으로 마이그레이션해야합니다.

13
32 비트 더 많은 시간.
— user606723

답변:


107

이것들 중 아무것도 나를 위해 일하지 않았습니다 ... 타임 스탬프를 다시 변환했을 때 4 년이 걸립니다.

이것은 완벽하게 작동했습니다. =(A2-DATE(1970,1,1))*86400

출처 : Filip Czaja http://fczaja.blogspot.ca

원본 게시물 : http://fczaja.blogspot.ca/2011/06/convert-excel-date-into-timestamp.html


6
시간대를 잊지 마세요 (UTC에 있고 서머 타임을 준수하지 않는 경우). UNIX 시대는 표준 시간대와 무관하지만 스프레드 시트는 그렇지 않습니다. 여기 에 예제 가있는 가이드 가 있습니다.
— 아담 카츠

GMT + 8 :=((A1+28800)/86400)+25569
— Ivan Chau

CDT의 현재 시간 (중부 일광 절약 시간) :=(NOW()-DATE(1970,1,1))*86400 + 5*3600
— hBrent

: 당신이 세미콜론으로 쉼표를 교체하지 않는 이상 엑셀의 최신 버전은 공식 호소합니다(1970;1;1)
— 호세 루이스 블랑코

1
@tonygil 대상 셀이 실제로 Excel의 날짜 인 경우 작동합니다. 날짜를 나타내는 텍스트라면 모든 베팅이 해제됩니다.
— Casey

75

Windows 및 Mac Excel (2011) :

Unix Timestamp = (Excel Timestamp - 25569) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 25569

MAC OS X (2007) :

Unix Timestamp = (Excel Timestamp - 24107) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 24107

참고로 :

86400 = Seconds in a day
25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
24107 = Days between 1970/01/01 and 1904/01/02 (min date in Mac Excel 2007)

3
Mac 용 Office 2011은 이러한 수식의 "Windows"버전에서 제대로 작동하는 것 같습니다. "Mac"버전은 출시되지 않았습니다.
— radicand 2013

1
나는 당신이 그 공식에서 엑셀과 유닉스 타임 스탬프를 뒤집 었다고 생각합니다. Unix 타임 스탬프는 초 수이므로 수식에서 말하는 Excel 타임 스탬프가 아닌 86400으로 나누어야합니다. @radicand의 답변을 참조하십시오.
— Mike Houston

의견을 보내 주셔서 감사합니다. Mac Excel 2011에서 테스트했으며 Windows 버전과 동일한 것 같습니다.
— Jeff Wu

밀리 초 단위의 유닉스 팀 스탬프를 밀리 초를 보존하면서 datetime으로 변환하는 방법이 있습니까?
— Lorenzo Belli

stackoverflow에 남자가 말합니다. 네, 윤초는 어떻습니까, 교수님.
— catamphetamine

11

Excel의 날짜가 날짜 형식의 A1 셀에 있고 Unix 타임 스탬프가 숫자 형식의 A2 셀에 있어야한다고 가정하면 A2의 수식은 다음과 같아야합니다.

= (A1 * 86400)-2209075200

어디:

86400은 하루의 초 수입니다. 2209075200은 Excel 및 Unix 타임 스탬프의 기본 날짜 인 1900-01-01과 1970-01-01 사이의 초 수입니다.

위의 내용은 Windows에 해당됩니다. Mac에서 Excel의 기본 날짜는 1904-01-01이고 초 숫자는 2082844800으로 수정되어야합니다.


적어도 창문에서는 정확히 작동하지 않습니다. 19 시간 떨어져 있습니다.
— LLBBL

4
따라서 다음과 같아야합니다. = (A1 * 86400)-2209143600
— LLBBL

2
Mac Excel 기본 날짜 기반은 1904이고 Windows Excel에서는 1900이지만 기본 설정 / 계산에서 "1904 날짜 시스템 사용"을 선택 취소하여 Mac Excel에서 날짜 기반을 변경할 수 있으며 Windows Excel처럼 작동합니다.
— Cloudranger 2013

6

다음은 Microsoft Excel과 같은 스프레드 시트 시스템에 대해 UTC 를 가정 한 참조 용 매핑입니다 .

                         Unix  Excel Mac    Excel    Human Date  Human Time
Excel Epoch       -2209075200      -1462        0    1900/01/00* 00:00:00 (local)
Excel ≤ 2011 Mac† -2082758400          0     1462    1904/12/31  00:00:00 (local)
Unix Epoch                  0      24107    25569    1970/01/01  00:00:00 UTC
Example Below      1234567890      38395.6  39857.6  2009/02/13  23:31:30 UTC
Signed Int Max     2147483648      51886    50424    2038/01/19  03:14:08 UTC

One Second                  1       0.0000115740…             —  00:00:01
One Hour                 3600       0.0416666666…             ―  01:00:00
One Day                 86400          1        1             ―  24:00:00

*   'Jan Zero, 1900'은 1899/12/31입니다. 아래의 버그 섹션을 참조하십시오 . † Mac 용 Excel 2011 (및 이전 버전)은 1904 날짜 체계를 사용합니다 .

 

CSV 및 공백으로 구분 된 콘텐츠 awk를 처리 하는 데 자주 사용 하면서 UNIX 시대를 시간대 / DST에 적합한 Excel 날짜 형식 으로 변환하는 방법을 개발했습니다 .

echo 1234567890 |awk '{ 
  # tries GNU date, tries BSD date on failure
  cmd = sprintf("date -d@%d +%%z 2>/dev/null || date -jf %%s %d +%%z", $1, $1)
  cmd |getline tz                                # read in time-specific offset
  hours = substr(tz, 2, 2) + substr(tz, 4) / 60  # hours + minutes (hi, India)
  if (tz ~ /^-/) hours *= -1                     # offset direction (east/west)
  excel = $1/86400 + hours/24 + 25569            # as days, plus offset
  printf "%.9f\n", excel
}'

내가 사용 echo이 예를 들어,하지만 당신은 파이프 첫 번째 열 (.CSV 형식의 첫 번째 셀에 대한이 같은 호출 파일을 할 수있는 awk -F,) 유닉스 시대입니다. $1원하는 열 / 셀 번호를 나타내도록 변경 하거나 대신 변수를 사용하십시오.

이렇게하면에 대한 시스템 호출이 생성됩니다 date. GNU 버전을 안정적으로 사용하려면 2>/dev/null || date … +%%z및 두 번째 , $1. GNU가 얼마나 일반적인지를 감안할 때 BSD 버전을 가정하지 않는 것이 좋습니다.

는 로 getline출력 된 표준 시간대 오프셋을 읽은 다음로 변환됩니다 . 형식과 같은 것 ( PDT ) 또는 ( IST 추출 제 문자열이되도록) 나 , 제는 또는 (다음 시간에 표현하는 60로 나눈 값)과의 세 번째 사용 되는 우리의 오프셋 여부 보는 음극과 달라져date +%ztzhours-0700+053007050030tzhours 필요한 경우.

이 페이지의 다른 모든 답변에 제공된 공식은을 설정하는 데 사용되며 excel일광 절약 시간 인식 시간대 조정을 hours/24.

이전 버전의 Mac 용 Excel을 사용 24107하는 경우 대신 다음 을 사용해야합니다 .25569 (위의 매핑 참조).

임의의 비 Epoch 시간을 GNU 날짜를 사용하여 Excel에 적합한 시간으로 변환하려면 :

echo "last thursday" |awk '{ 
  cmd = sprintf("date -d \"%s\" +\"%%s %%z\"", $0)
  cmd |getline
  hours = substr($2, 2, 2) + substr($2, 4) / 60
  if ($2 ~ /^-/) hours *= -1
  excel = $1/86400 + hours/24 + 25569
  printf "%.9f\n", excel
}'

이것은 기본적으로 동일한 코드이지만 date -d더 이상 @유닉스 시대를 나타내는 데 더 이상 필요하지 않습니다 (문자열 파서가 얼마나 능력이 있는가를 감안할 때, 실제로 @는 필수입니다; 다른 날짜 형식에 9-10 자리가 있습니까?). 위한 두 개의 출력 : 에포크 및 시간대 오프셋. 따라서 예 @1234567890를 들어 입력으로 사용할 수 있습니다 .

곤충

Lotus 1-2-3 (원래 스프레드 시트 소프트웨어)은 1900 년 이 아니 었음에도 불구하고 의도적 으로 1900 년을 윤년 으로 취급 했습니다 (이는 모든 바이트를 계산할 때 코드베이스를 줄였습니다). Microsoft Excel 은 호환성을 위해이 버그를 유지 하여 60 일 (가상 1900/02/29)을 건너 뛰고 Lotus 1-2-3의 59 일을 1900/02/28 일로 매핑했습니다. LibreOffice는 대신 60 일을 1900/02/28로 할당하고 이전의 모든 날을 뒤로 밀었습니다.

1900/03/01 이전의 모든 날짜는 쉬는 날과 같을 수 있습니다.

Day        Excel   LibreOffice
-1            -1    1899/12/29
 0    1900/01/00*   1899/12/30
 1    1900/01/01    1899/12/31
 2    1900/01/02    1900/01/01
 …
59    1900/02/28    1900/02/27
60    1900/02/29(!) 1900/02/28
61    1900/03/01    1900/03/01

Excel은 음수 날짜를 인식하지 않으며 0 일에 대한 1 월 0 일 (1899/12/31)에 대한 특별한 정의가 있습니다. 내부적으로 Excel은 실제로 음수 날짜를 처리하지만 (결국 숫자 일뿐) 날짜로 표시하는 방법을 모르기 때문에 숫자로 표시합니다 (이전 날짜를 음수로 변환 할 수도 없음). 일이 없었던 1900 년 2 월 29 일은 Excel에서는 인식되지만 LibreOffice에서는 인식되지 않습니다.


3

위의 편집 내용이 거부 되었기 때문에 (실제로 시도한 사람이 있습니까?),이 작업을 수행하는 데 실제로 필요한 것은 다음과 같습니다.

Windows (및 Mac Office 2011+) :

  • Unix 타임 스탬프 = (Excel Timestamp - 25569) * 86400
  • Excel 타임 스탬프 = (Unix Timestamp / 86400) + 25569

MAC OS X (Pre Office 2011) :

  • Unix 타임 스탬프 = (Excel Timestamp - 24107) * 86400
  • Excel 타임 스탬프 = (Unix Timestamp / 86400) + 24107

2

당신은 분명히 하루, 정확히 86400 초 떨어져 있습니다. 번호 2209161600을 사용하세요. 번호 2209075200이 아닙니다. 두 번호를 Google에 검색하면 위의 지원을 찾을 수 있습니다. 나는 당신의 공식을 시도했지만 항상 내 서버와 다른 하루가 올랐습니다. 인간의 시간 대신 유닉스에서 생각하지 않는 한 유닉스 타임 스탬프에서 명확하지 않습니다 ;-) 그러나 다시 확인하면 이것이 정확할 수 있음을 알 수 있습니다.


Excel이 첫해를 윤년이 아닌 경우에도 윤년으로 계산하기 때문에 이것은 정확합니다.
— ANisus 2011 년

매직 넘버가 실제로 2209161600 인 것을 확인할 수 있습니다. 이것은 1970-01-01-1900-01-01 + 1 일 * 86400입니다. 엑셀에 1900-01-01을 입력하고 sylk 형식으로 저장하고 다음에서 파일을 보면 텍스트 편집기에서 해당 날짜를 0이 아닌 1로 저장하는 것을 볼 수 있습니다. 따라서 1 일을 추가해야합니다
— Cloudranger 2013

1

나는 2010.03.28 20:12:30 과 같이 "사람이 읽을 수있는"날짜를 가진 오래된 Excel 데이터베이스를 가지고있었습니다. Theese 날짜는 UTC + 1 (CET)로되어 있었고 그것을 epoch 시간으로 변환해야했습니다.

I는 사용 86400-3600 * = (; 1) A4-DATE (1970) 수식 B 열 값은 A 열에서 에포크 시간 기간을 변환한다. 시간대 오프셋을 확인하고 계산해보세요. 1 시간은 3600 초입니다.

내가 여기에 답글을 쓰는 유일한 이유는이 주제가 5 년 이상 된 것임을 알 수 있습니다.이 주제에서 새 Excel 버전과 빨간색 게시물을 사용한다는 것입니다. DATE (1970; 1; 1). 여기서 1970 년과 1 월은로 분리되어야합니다. 및,

이 문제가 발생하는 경우 도움이되기를 바랍니다. 좋은 하루 되세요 :)


0

내 데이터가 유닉스 측면에서 이러한 형식 이었기 때문에 현재 답변 중 어느 것도 나를 위해 일하지 않았습니다.

2016-02-02 19:21:42 UTC

에포크 타임 스탬프가있는 다른 데이터를 참조 할 수 있도록 이것을 Epoch로 변환해야했습니다.

  1. 날짜 부분에 대한 새 열을 만들고이 수식으로 구문 분석

    =DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4)) 
    
  2. 다른 Grendler가 이미 여기에서 언급했듯이 다른 열을 만듭니다.

    =(B2-DATE(1970,1,1))*86400 
    
  3. 총 초를 얻기 위해 시간 만 더한 다른 열을 만듭니다.

    =(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
    
  4. 마지막 두 열을 함께 추가하는 마지막 열을 만듭니다.

    =C2+D2
    

0

여기에 대한 나의 궁극적 인 대답이 있습니다.

또한 분명히 javascript의 new Date(year, month, day)생성자는 윤초도 고려하지 않습니다.

// Parses an Excel Date ("serial") into a
// corresponding javascript Date in UTC+0 timezone.
//
// Doesn't account for leap seconds.
// Therefore is not 100% correct.
// But will do, I guess, since we're
// not doing rocket science here.
//
// https://www.pcworld.com/article/3063622/software/mastering-excel-date-time-serial-numbers-networkdays-datevalue-and-more.html
// "If you need to calculate dates in your spreadsheets,
//  Excel uses its own unique system, which it calls Serial Numbers".
//
lib.parseExcelDate = function (excelSerialDate) {
  // "Excel serial date" is just
  // the count of days since `01/01/1900`
  // (seems that it may be even fractional).
  //
  // The count of days elapsed
  // since `01/01/1900` (Excel epoch)
  // till `01/01/1970` (Unix epoch).
  // Accounts for leap years
  // (19 of them, yielding 19 extra days).
  const daysBeforeUnixEpoch = 70 * 365 + 19;

  // An hour, approximately, because a minute
  // may be longer than 60 seconds, see "leap seconds".
  const hour = 60 * 60 * 1000;

  // "In the 1900 system, the serial number 1 represents January 1, 1900, 12:00:00 a.m.
  //  while the number 0 represents the fictitious date January 0, 1900".
  // These extra 12 hours are a hack to make things
  // a little bit less weird when rendering parsed dates.
  // E.g. if a date `Jan 1st, 2017` gets parsed as
  // `Jan 1st, 2017, 00:00 UTC` then when displayed in the US
  // it would show up as `Dec 31st, 2016, 19:00 UTC-05` (Austin, Texas).
  // That would be weird for a website user.
  // Therefore this extra 12-hour padding is added
  // to compensate for the most weird cases like this
  // (doesn't solve all of them, but most of them).
  // And if you ask what about -12/+12 border then
  // the answer is people there are already accustomed
  // to the weird time behaviour when their neighbours
  // may have completely different date than they do.
  //
  // `Math.round()` rounds all time fractions
  // smaller than a millisecond (e.g. nanoseconds)
  // but it's unlikely that an Excel serial date
  // is gonna contain even seconds.
  //
  return new Date(Math.round((excelSerialDate - daysBeforeUnixEpoch) * 24 * hour) + 12 * hour);
};

0

일광 절약 시간 (3 월 마지막 일요일부터 10 월 마지막 일요일까지) 을 보충하기 위해 다음 공식을 사용해야했습니다.

=IF(
  AND(
    A2>=EOMONTH(DATE(YEAR(A2);3;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);3;1);0);11);7);
    A2<=EOMONTH(DATE(YEAR(A2);10;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);10;1);0);11);7)
  );
  (A2-DATE(1970;1;1)-TIME(1;0;0))*24*60*60*1000;
  (A2-DATE(1970;1;1))*24*60*60*1000
)

빠른 설명 :

날짜 [ "A2"]가 3 월의 마지막 일요일과 10 월의 마지막 일요일 [세 번째 및 네 번째 코드 줄] 사이이면 날짜에서 1 시간 [-TIME (1; 0; 0)]을 뺍니다.

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