Excel日期到Unix时间戳

Hag*_*ard 81 excel

有谁知道如何将Excel日期转换为正确的Unix时间戳?

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

  • 不要忘记你的时区(除非你是UTC,而不是观察夏令时).UNIX纪元与时区无关,而电子表则不然.[这是一个指南](http://untangible.com/2009/01/covert-unix-epoch-dates-in-microsoft-excel-including-timezone-examples.html)以及示例. (5认同)

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)

  • Mac上的Office 2011似乎可以正常使用这些公式的"Windows"版本."Mac"版本就不用了. (3认同)

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

  • 所以它应该是这样的:=(A1*86400) - 2209143600 (4认同)
  • Mac Excel默认日期基准为1904,而在Windows Excel中为1900,但您可以通过在首选项/计算下取消选中"使用1904日期系统"来更改Mac Excel中的日期基础,然后它就像windows excel一样工作. (2认同)

rad*_*and 6

因为我对上述内容的编辑被拒绝了(你们中有人真正尝试过吗?),因此您真正需要的是以下内容:

Windows(和 Mac Office 2011+):

  • Unix 时间戳 =(Excel Timestamp - 25569) * 86400
  • Excel 时间戳 =(Unix Timestamp / 86400) + 25569

MAC OS X(Office 2011 之前的版本):

  • Unix 时间戳 =(Excel Timestamp - 24107) * 86400
  • Excel 时间戳 = (Unix Timestamp / 86400) + 24107


Ada*_*atz 6

这是一个参考映射,假设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 +%ztz,然后将其翻译成hours.格式将类似于-0700(PDT)或+0530(IST),因此提取的第一个子字符串是0705,第二个是0030(然后除以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.