Cyb*_*ell 103
其中没有这些对我有用......当我把时间戳转换回来时,它还有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
Jef*_* Wu 70
Windows和Mac Excel(2011):
Unix Timestamp = (Excel Timestamp - 25569) * 86400
Excel Timestamp = (Unix Timestamp / 86400) + 25569
Run Code Online (Sandbox Code Playgroud)
MAC OS X(2007):
Unix Timestamp = (Excel Timestamp - 24107) * 86400
Excel Timestamp = (Unix Timestamp / 86400) + 24107
Run Code Online (Sandbox Code Playgroud)
以供参考:
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)
Run Code Online (Sandbox Code Playgroud)
Gre*_*ler 11
如果我们假设Excel中的日期是A1格式的日期格式,并且Unix时间戳应该是格式化为数字的A2格式,则A2中的公式应为:
=(A1*86400) - 2209075200
哪里:
86400是当天的秒数2209075200是1900-01-01和1970-01-01之间的秒数,这是Excel和Unix时间戳的基准日期.
以上适用于Windows.在Mac上,Excel中的基准日期为1904-01-01,秒数应更正为:2082844800
因为我对上述内容的编辑被拒绝了(你们中有人真正尝试过吗?),因此您真正需要的是以下内容:
Windows(和 Mac Office 2011+):
(Excel Timestamp - 25569) * 86400
(Unix Timestamp / 86400) + 25569
MAC OS X(Office 2011 之前的版本):
(Excel Timestamp - 24107) * 86400
(Unix Timestamp / 86400) + 24107
这是一个参考映射,假设UTC为电子表格系统,如Microsoft Excel:
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
Run Code Online (Sandbox Code Playgroud)
* "Jan Zero,1900"是1899/12/31; 请参阅下面的Bug部分.† Excel 2011 for Mac(及更早版本)使用1904日期系统.
正如我经常awk
用来处理CSV和空格分隔的内容,我开发了一种方法将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
}'
Run Code Online (Sandbox Code Playgroud)
我用echo
这个例子,但你可以管道一个文件,其中第一列(对于.csv格式的第一个单元,称之为awk -F,
)是一个UNIX纪元.更改$1
以表示所需的列/单元格编号或使用变量.
这使得系统调用date
.如果您可靠地拥有GNU版本,则可以删除2>/dev/null || date … +%%z
第二个, $1
.考虑到GNU的常见程度,我不建议假设BSD的版本.
该getline
读出时区由输出偏移date +%z
成tz
,然后将其翻译成hours
.格式将类似于-0700
(PDT)或+0530
(IST),因此提取的第一个子字符串是07
或05
,第二个是00
或30
(然后除以60以小时表示),第三个用于tz
查看我们的偏移是否为负并且改变hours
如果需要的话.
此页面上所有其他答案中给出的公式用于设置excel
,并添加了日光节省感知时区调整hours/24
.
如果您使用的是旧版Excel for Mac,则需要使用24107
以代替25569
(请参阅上面的映射).
要使用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
}'
Run Code Online (Sandbox Code Playgroud)
这基本上是相同的代码,但是date -d
不再有@
代表unix时代(考虑到字符串解析器的能力,我实际上对于@
强制性而感到惊讶;其他日期格式有9-10位数?)现在问了它为2个输出:历元和时区偏移.因此,您可以使用例如@1234567890
作为输入.
Lotus 1-2-3(原始电子表格软件)故意将1900作为闰年处理,尽管它不是(这在每个字节计数时减少了代码库).Microsoft Excel 保留了这个兼容性错误,跳过了第60天(虚构的1900/02/29),保留了Lotus 1-2-3的第59天到1900/02/28的映射.LibreOffice转而分配到第60天至1900年2月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
Run Code Online (Sandbox Code Playgroud)
Excel不承认否定日期,并且对于第0天的1月份(1899/12/31)有一个特殊的定义.在内部,Excel确实处理负日期(它们毕竟只是数字),但它将它们显示为数字,因为它不知道如何将它们显示为日期(也不能将旧日期转换为负数).1900年2月29日,一个从未发生过的日子,被Excel认可,但不是LibreOffice.
归档时间: |
|
查看次数: |
164490 次 |
最近记录: |