是否将JSON日期转换为MM/DD/YYYY格式?

是否将JSON日期转换为MM/DD/YYYY格式?,json,vba,date,excel-2010,Json,Vba,Date,Excel 2010,我的客户收到一份有很多列的电子表格,其中一列是“日期”。只有日期被格式化为日期(1292291582263-0700)(似乎是JSON日期) 我需要以MM/DD/YYYY格式转换和使用这个JSON日期,在这个电子表格代码(VBA)的其他地方 有人知道如何解析这个JSON日期格式并将其转换为MM/DD/YYYY格式吗?我已经阅读了很多关于Javascript、C#或ASP.NET等的解决方案,但是我所要使用的就是这个项目的Excel 2010和VBA代码。有没有办法达到我所需要的可读格式?毫秒历元

我的客户收到一份有很多列的电子表格,其中一列是“日期”。只有日期被格式化为
日期(1292291582263-0700)
(似乎是JSON日期)

我需要以MM/DD/YYYY格式转换和使用这个JSON日期,在这个电子表格代码(VBA)的其他地方


有人知道如何解析这个JSON日期格式并将其转换为MM/DD/YYYY格式吗?我已经阅读了很多关于Javascript、C#或ASP.NET等的解决方案,但是我所要使用的就是这个项目的Excel 2010和VBA代码。有没有办法达到我所需要的可读格式?

毫秒历元时间和+/-偏移

Const test = "1292291582263-0700"

Dim dt As String: dt = Left$(test, 13)
Dim off As String: off = Mid$(test, 14)

Dim d As Date: d = DateAdd("s", CCur(dt) / 1000, "01/01/1970")
Debug.Print d
<<< 14/12/2010 01:53:02 

d = DateAdd("h", Left$(off, 3), d)
d = DateAdd("n", Right$(off, 2), d)
Debug.Print d
<<< 13/12/2010 18:53:02 
Const test=“1292291582263-0700”
作为字符串的Dim dt:dt=Left$(测试,13)
变暗为字符串:off=Mid$(测试,14)
尺寸d作为日期:d=日期添加(“s”,CCur(dt)/1000,“01/01/1970”)
调试。打印d

此函数用于处理1971-01-01之前的日期和一些溢出问题

Public Function Convert_Microsoft_Json_Date_To_Date(strMicrosoftDate As String) As Date
'Convert_Microsoft_Json_Date_To_Date("/Date(-2208970800000-0530)/") => 1900-01-01
'Convert_Microsoft_Json_Date_To_Date("/Date(2208970800000-0530)/") => 2039-12-31 14:00:00
Dim strProcedureName As String: strProcedureName = "Convert_Microsoft_Json_Date_To_Date"
Dim lngDateNumber As Long
Dim strOffsetSign As String
Dim strOffsetHours As String
Dim strOffsetMinutes As String
Dim dteDateNoOffset As Date
Dim dteRealDate As Date
Dim curSecondToAdd As Currency '+ or -
Dim curSecondLeft As Currency
Dim curSecondMax As Currency
Dim IsOffsetExist As Boolean

On Error GoTo err_

strMicrosoftDate = Replace(strMicrosoftDate, "/", "")
strMicrosoftDate = Replace(strMicrosoftDate, "(", "")
strMicrosoftDate = Replace(strMicrosoftDate, ")", "")
strMicrosoftDate = Replace(strMicrosoftDate, "Date", "")

strOffsetSign = Left(Right(strMicrosoftDate, 5), 1)
strOffsetHours = Left(Right(strMicrosoftDate, 4), 2)
strOffsetMinutes = Right(strMicrosoftDate, 2)

IsOffsetExist = strOffsetSign = "+" Or strOffsetSign = "-"

If IsOffsetExist Then
    'Remove the offset part if exist
    strMicrosoftDate = Left(strMicrosoftDate, Len(strMicrosoftDate) - 5)
End If
curSecondMax = 1000000000# 'if curSecondToAdd is to high we get overflow, and I do it in 2 step below to get my date
curSecondToAdd = CCur(strMicrosoftDate) / 1000 'Convert miliseconds to seconds

If Abs(curSecondToAdd) > curSecondMax Then
    If curSecondToAdd >= 0 Then
        dteDateNoOffset = DateAdd("s", curSecondToAdd - curSecondMax, DateSerial(1970, 1, 1))
        dteDateNoOffset = DateAdd("s", curSecondMax, dteDateNoOffset)
    Else
        dteDateNoOffset = DateAdd("s", curSecondToAdd + curSecondMax, DateSerial(1970, 1, 1))
        dteDateNoOffset = DateAdd("s", -curSecondMax, dteDateNoOffset)
    End If
Else

    dteDateNoOffset = DateAdd("s", curSecondToAdd, DateSerial(1970, 1, 1))
End If

'Debug.Print "Date no offset: " & dteDateNoOffset

If IsOffsetExist Then
    dteRealDate = DateAdd("h", CInt(strOffsetSign & strOffsetHours), dteDateNoOffset)
    dteRealDate = DateAdd("n", CInt(strOffsetSign & strOffsetMinutes), dteRealDate)
Else
    dteRealDate = dteDateNoOffset
End If
'Debug.Print "Date real: " & dteRealDate

Convert_Microsoft_Json_Date_To_Date = dteRealDate

err_exit:

    Exit Function


err_:
Select Case Err.Number

    Case Else
        MsgBox Err.Description & " | " & Err.Number & vbCrLf & "Procedure: " & strProcedureName & IIf(Erl <> 0, vbCrLf & "Ligne: " & Erl, ""), vbCritical
        Resume err_exit
        Resume
End Select
End Function
Public函数将_Microsoft_Json_Date_转换为_Date(strMicrosoftDate作为字符串)作为日期
“将Microsoft Json日期转换为日期(“/Date(-2208970800000-0530)/”)=>1900-01-01
“将Microsoft Json日期转换为日期(“/Date(2208970800000-0530)/”=>2039-12-31 14:00:00
将strProcedureName设置为字符串:strProcedureName=“将\u Microsoft\u Json\u日期\u转换为\u日期”
暗淡的lngDateNumber和长的一样
Dim strOffsetSign As字符串
Dim strOffsetHours作为字符串
Dim strOffsetMinutes作为字符串
Dim DTEDA偏移量为日期
Dim dteRealDate作为日期
Dim CURSECOND加载为货币“+或”-
作为货币的暗光标
Dim curSecondMax作为货币
Dim IsofSetExist为布尔值
上错下错_
strMicrosoftDate=替换(strMicrosoftDate,“/”,“)
strMicrosoftDate=替换(strMicrosoftDate,“(”,“)
strMicrosoftDate=替换(strMicrosoftDate,“)”,“)
strMicrosoftDate=替换(strMicrosoftDate,“日期”,“替换”)
strOffsetSign=左(右(strMicrosoftDate,5),1)
strOffsetHours=左(右(strMicrosoftDate,4),2)
strOffsetMinutes=右(strMicrosoftDate,2)
IsofSetExist=strOffsetSign=“+”或strOffsetSign=“-”
如果不存在,那么
'删除偏移零件(如果存在)
strMicrosoftDate=左(strMicrosoftDate,Len(strMicrosoftDate)-5)
如果结束
curSecondMax=1000000000#“如果cursecondload太高,我们会得到溢出,我会在下面的两个步骤中得到我的日期
CursecondLoadd=CCur(strMicrosoftDate)/1000'将毫秒转换为秒
如果Abs(cursecondload)>curSecondMax,则
如果CursecondLoadd>=0,则
dteDateNoOffset=DateAdd(“s”,cursecondload-curSecondMax,DateSerial(1970,1,1))
dteDateNoOffset=日期添加(“s”,光标最大,dteDateNoOffset)
其他的
dteDateNoOffset=DateAdd(“s”,cursecondload+curSecondMax,DateSerial(1970,1,1))
dteDateNoOffset=DateAdd(“s”、-curSecondMax、dteDateNoOffset)
如果结束
其他的
dteDateNoOffset=DateAdd(“s”,cursecondload,DateSerial(1970,1,1))
如果结束
“Debug.Print”日期无偏移:“&dteDateNoOffset”
如果不存在,那么
dteRealDate=DateAdd(“h”,CInt(strOffsetSign&strOffsetHours),DTEDATENOFFSET)
dteRealDate=日期添加(“n”,CInt(strOffsetSign&strOffsetMinutes),dteRealDate)
其他的
dteRealDate=dteDateNoOffset
如果结束
“Debug.Print”实际日期:&dteRealDate
将\u Microsoft\u Json\u Date\u转换为\u Date=dteRealDate
错误退出:
退出功能
错误:
选择案例错误编号
其他情况
MsgBox错误描述&“|”&错误编号&vbCrLf&“过程:”&strProcedureName&IIf(Erl 0,vbCrLf&“对齐:&Erl,”),vbCritical
恢复错误退出
简历
结束选择
端函数

JSON中没有日期类型。看到右边的边栏:@Matt:OK,但是有没有办法将这个字符串转换成可读的日期格式(不使用Javascript等?)仅仅是一个手写函数或什么的?就是这样!非常感谢你!请把解释放在你的答案中,而不是作为评论。