누구든지 Excel 날짜를 올바른 Unix 타임 스탬프로 변환하는 방법을 알고 있습니까?
누구든지 Excel 날짜를 올바른 Unix 타임 스탬프로 변환하는 방법을 알고 있습니까?
답변:
이것들 중 아무것도 나를 위해 일하지 않았습니다 ... 타임 스탬프를 다시 변환했을 때 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
=((A1+28800)/86400)+25569
=(NOW()-DATE(1970,1,1))*86400 + 5*3600
(1970;1;1)
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)
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으로 수정되어야합니다.
다음은 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 +%z
tz
hours
-0700
+0530
07
05
00
30
tz
hours
필요한 경우.
이 페이지의 다른 모든 답변에 제공된 공식은을 설정하는 데 사용되며 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에서는 인식되지 않습니다.
위의 편집 내용이 거부 되었기 때문에 (실제로 시도한 사람이 있습니까?),이 작업을 수행하는 데 실제로 필요한 것은 다음과 같습니다.
Windows (및 Mac Office 2011+) :
(Excel Timestamp - 25569) * 86400
(Unix Timestamp / 86400) + 25569
MAC OS X (Pre Office 2011) :
(Excel Timestamp - 24107) * 86400
(Unix Timestamp / 86400) + 24107
당신은 분명히 하루, 정확히 86400 초 떨어져 있습니다. 번호 2209161600을 사용하세요. 번호 2209075200이 아닙니다. 두 번호를 Google에 검색하면 위의 지원을 찾을 수 있습니다. 나는 당신의 공식을 시도했지만 항상 내 서버와 다른 하루가 올랐습니다. 인간의 시간 대신 유닉스에서 생각하지 않는 한 유닉스 타임 스탬프에서 명확하지 않습니다 ;-) 그러나 다시 확인하면 이것이 정확할 수 있음을 알 수 있습니다.
나는 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 월은로 분리되어야합니다. 및,
이 문제가 발생하는 경우 도움이되기를 바랍니다. 좋은 하루 되세요 :)
내 데이터가 유닉스 측면에서 이러한 형식 이었기 때문에 현재 답변 중 어느 것도 나를 위해 일하지 않았습니다.
2016-02-02 19:21:42 UTC
에포크 타임 스탬프가있는 다른 데이터를 참조 할 수 있도록 이것을 Epoch로 변환해야했습니다.
날짜 부분에 대한 새 열을 만들고이 수식으로 구문 분석
=DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4))
다른 Grendler가 이미 여기에서 언급했듯이 다른 열을 만듭니다.
=(B2-DATE(1970,1,1))*86400
총 초를 얻기 위해 시간 만 더한 다른 열을 만듭니다.
=(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
마지막 두 열을 함께 추가하는 마지막 열을 만듭니다.
=C2+D2
여기에 대한 나의 궁극적 인 대답이 있습니다.
또한 분명히 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);
};
일광 절약 시간 (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)]을 뺍니다.
"11/09/2009 3:23:24 PM"
합니까?