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/0159    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.