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

Posted

技术标签:

【中文标题】将 JSON 日期转换为 MM/DD/YYYY 格式?【英文标题】:Convert JSON Date To MM/DD/YYYY Format? 【发布时间】:2011-08-13 22:46:09 【问题描述】:

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

我需要在此电子表格代码 (VBA) 的其他位置以 MM/DD/YYYY 格式转换和使用此 JSON 日期。

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

【问题讨论】:

JSON 中没有日期类型。见右侧边栏:json.org @Matt: 好的,但是有没有办法把这个字符串转换成可读的日期格式(不使用 Javascript 等?)只是一个手写函数之类的? 【参考方案1】:

带有 +/- 偏移量的毫秒纪元时间?

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 

【讨论】:

就是这样!非常感谢!【参考方案2】:

此函数处理 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

【讨论】:

请在您的回答中加入解释,而不是作为评论。

以上是关于将 JSON 日期转换为 MM/DD/YYYY 格式?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将日期字符串从格式 mm/d/yyyy 和 mm/dd/yyyy 转换为 dd.mm.yyyy

将格式 MM/DD/YYYY 的日期转换为 MySQL 日期 [重复]

如何将日期转换为格式`mm/dd/yyyy`

SQL SERVER中日期的显示格式为YYYY-MM-DD,怎样设置为MM/DD/YYYY呢?

将 dd/mm/yyyy 格式的字符串转换为日期时间 [重复]

java.text.ParseException:无法解析的日期:将 mm/dd/yyyy 字符串转换为日期