关于Unix时间戳转换为Excel日期时间及Windows时间戳格式的技术问询
Unix时间戳转换为Excel日期时间及Windows时间戳格式的技术问询
嘿,我来帮你搞定这个Unix转Windows时间戳的问题!首先得理清楚两者的基准差异:Unix时间戳是从1970年1月1日00:00:00 UTC开始计算的秒数,而Windows版Excel的时间戳基准是1900年1月0日(没错,是0日),单位是天。所以转换的核心就是把秒数转成天,再加上基准时间的偏移量。
方法一:不用VBA,直接用Excel公式
如果只是单个或少量转换,直接在单元格里用公式就行:=(A1/86400)+DATE(1970,1,1)
- 这里
A1是存放Unix时间戳(比如你给的1662091200)的单元格 86400是一天的总秒数(246060)- 输入公式后,记得把单元格格式设置为「日期时间」类型(比如选「yyyy-mm-dd hh:mm:ss」),就能看到清晰的时间了——你给的这个时间戳转出来是
2022-09-02 00:00:00哦。
方法二:用VBA自定义函数(更灵活)
如果需要频繁转换,或者要在公式里复用,写个自定义函数最方便:
- 打开Excel,按下
Alt+F11进入VBA编辑器 - 右键点击左侧的工作簿名称,选择「插入」→「模块」
- 粘贴下面的代码:
Function UnixToExcelTime(UnixTimestamp As Double) As Date ' 将Unix时间戳(秒级)转换为Excel日期时间格式 UnixToExcelTime = (UnixTimestamp / 86400) + DateSerial(1970, 1, 1) End Function
- 回到Excel界面,在单元格里输入
=UnixToExcelTime(1662091200),就能直接得到转换后的日期时间啦,同样记得设置单元格格式。
方法三:VBA批量转换(适合大量数据)
要是你有一整列的Unix时间戳需要转换,可以用这个批量处理的宏:
Sub BatchConvertUnixToExcel() Dim ws As Worksheet Dim lastRow As Long Dim i As Long ' 这里可以改成你要处理的工作表名,比如"ThisWorkbook.Worksheets("数据页")" Set ws = ActiveSheet ' 获取A列最后一行有数据的行号 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 循环处理每一行 For i = 1 To lastRow ' 只处理数值型的时间戳 If IsNumeric(ws.Cells(i, "A").Value) Then ws.Cells(i, "B").Value = (ws.Cells(i, "A").Value / 86400) + DateSerial(1970, 1, 1) ' 设置B列单元格为标准日期时间格式 ws.Cells(i, "B").NumberFormat = "yyyy-mm-dd hh:mm:ss" End If Next i MsgBox "批量转换完成啦!", vbInformation End Sub
用法:同样在VBA编辑器里粘贴代码,回到Excel按下Alt+F8选中这个宏运行,就能把A列的时间戳批量转成B列的Excel时间格式。
⚠️ 注意:如果你的Unix时间戳是毫秒级的(比如13位数字),记得把代码里的86400改成86400000哦!
备注:内容来源于stack exchange,提问作者Prem




