การแยกวิเคราะห์วันที่ / เวลา ISO8601 (รวมถึง TimeZone) ใน Excel


85

ฉันต้องการแยกวิเคราะห์รูปแบบวันที่ / เวลา ISO8601 ด้วยเขตเวลาที่รวมไว้ (จากแหล่งภายนอก) ใน Excel / VBA เป็นวันที่ของ Excel ปกติ เท่าที่ฉันสามารถบอกได้ Excel XP (ซึ่งเป็นสิ่งที่เราใช้) ไม่มีรูทีนสำหรับในตัวดังนั้นฉันเดาว่าฉันกำลังดูฟังก์ชัน VBA ที่กำหนดเองสำหรับการแยกวิเคราะห์

เวลาที่ ISO8601 มีลักษณะดังนี้:

2011-01-01
2011-01-01T12:00:00Z
2011-01-01T12:00:00+05:00
2011-01-01T12:00:00-05:00
2011-01-01T12:00:00.05381+05:00

2
ตอนนี้เป็นปี 2020 และ Excel เวอร์ชันล่าสุดผ่าน Office 365 ยังไม่มีTryParseExactDate( "yyyy-MM-dd'T'HH:mm:ss", A1 )ฟังก์ชันง่ายๆในไลบรารีสูตรที่ขยายออกไป ข้อแก้ตัวของ Microsoft คืออะไร? :(
ได

คำตอบ:


172

มีวิธีง่ายๆ (สมเหตุสมผล) ในการแยกวิเคราะห์การประทับเวลา ISO โดยไม่มีเขตเวลาโดยใช้สูตรแทนมาโคร นี้ไม่ได้ว่าสิ่งที่โปสเตอร์เดิมได้ขอ แต่ผมพบว่าคำถามนี้เมื่อพยายามที่จะแยก ISO timestamps ใน Excel และพบว่าวิธีนี้มีประโยชน์ดังนั้นฉันคิดว่าฉันจะแบ่งปันได้ที่นี่

สูตรต่อไปนี้จะแยกวิเคราะห์การประทับเวลา ISO อีกครั้งโดยไม่มีเขตเวลา:

=DATEVALUE(MID(A1,1,10))+TIMEVALUE(MID(A1,12,8))

สิ่งนี้จะสร้างวันที่ในรูปแบบทศนิยมซึ่งคุณสามารถจัดรูปแบบเป็นวันที่โดยใช้รูปแบบ Excel ปกติได้


4
แปลกที่นี่ไม่ได้กลายเป็นคำตอบที่ยอมรับ มันง่ายกว่าที่อื่นมาก
Travis Griggs

6
แต่โซลูชันนี้จะไม่พิจารณาการแปลงเขตเวลา
Goku

1
นี่เป็นทางเลือกที่สมเหตุสมผลหากเขตเวลาไม่เกี่ยวข้องหรือเหมือนกันทั้งหมดเช่นเขตเวลาท้องถิ่น
kevinarpe

5
คุณสามารถเปลี่ยน8เป็น a 12เพื่อรวมมิลลิวินาทีได้หากต้องการและข้อมูลที่คุณป้อนรวมไว้ด้วย
gilly3

3
ฉันใช้สิ่งนี้เพื่อแปลงรหัสเวลา เพียงใส่ความแตกต่าง HH: MM ในส่วนสุดท้ายแล้วบวกหรือลบขึ้นอยู่กับเขตเวลา ในกรณีของฉันฉันช้ากว่า 6 ชั่วโมงดังนั้นฉันจึงลบมันออก =DATEVALUE(MID(C2,1,10))+TIMEVALUE(MID(C2,12,8))-TIMEVALUE("6:00")
chaiboy

44

Googling จำนวนมากไม่ได้ช่วยอะไรเลยดังนั้นฉันจึงเขียนกิจวัตรของตัวเอง โพสต์ไว้ที่นี่เพื่อใช้อ้างอิงในอนาคต:

Option Explicit

'---------------------------------------------------------------------
' Declarations must be at the top -- see below
'---------------------------------------------------------------------
Public Declare Function SystemTimeToFileTime Lib _
  "kernel32" (lpSystemTime As SYSTEMTIME, _
  lpFileTime As FILETIME) As Long

Public Declare Function FileTimeToLocalFileTime Lib _
  "kernel32" (lpLocalFileTime As FILETIME, _
  lpFileTime As FILETIME) As Long

Public Declare Function FileTimeToSystemTime Lib _
  "kernel32" (lpFileTime As FILETIME, lpSystemTime _
  As SYSTEMTIME) As Long

Public Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Public Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

'---------------------------------------------------------------------
' Convert ISO8601 dateTimes to Excel Dates
'---------------------------------------------------------------------
Public Function ISODATE(iso As String)
    ' Find location of delimiters in input string
    Dim tPos As Integer: tPos = InStr(iso, "T")
    If tPos = 0 Then tPos = Len(iso) + 1
    Dim zPos As Integer: zPos = InStr(iso, "Z")
    If zPos = 0 Then zPos = InStr(iso, "+")
    If zPos = 0 Then zPos = InStr(tPos, iso, "-")
    If zPos = 0 Then zPos = Len(iso) + 1
    If zPos = tPos Then zPos = tPos + 1

    ' Get the relevant parts out
    Dim datePart As String: datePart = Mid(iso, 1, tPos - 1)
    Dim timePart As String: timePart = Mid(iso, tPos + 1, zPos - tPos - 1)
    Dim dotPos As Integer: dotPos = InStr(timePart, ".")
    If dotPos = 0 Then dotPos = Len(timePart) + 1
    timePart = Left(timePart, dotPos - 1)

    ' Have them parsed separately by Excel
    Dim d As Date: d = DateValue(datePart)
    Dim t As Date: If timePart <> "" Then t = TimeValue(timePart)
    Dim dt As Date: dt = d + t

    ' Add the timezone
    Dim tz As String: tz = Mid(iso, zPos)
    If tz <> "" And Left(tz, 1) <> "Z" Then
        Dim colonPos As Integer: colonPos = InStr(tz, ":")
        If colonPos = 0 Then colonPos = Len(tz) + 1

        Dim minutes As Integer: minutes = CInt(Mid(tz, 2, colonPos - 2)) * 60 + CInt(Mid(tz, colonPos + 1))
        If Left(tz, 1) = "+" Then minutes = -minutes
        dt = DateAdd("n", minutes, dt)
    End If

    ' Return value is the ISO8601 date in the local time zone
    dt = UTCToLocalTime(dt)
    ISODATE = dt
End Function

'---------------------------------------------------------------------
' Got this function to convert local date to UTC date from
' http://excel.tips.net/Pages/T002185_Automatically_Converting_to_GMT.html
'---------------------------------------------------------------------
Public Function UTCToLocalTime(dteTime As Date) As Date
    Dim infile As FILETIME
    Dim outfile As FILETIME
    Dim insys As SYSTEMTIME
    Dim outsys As SYSTEMTIME

    insys.wYear = CInt(Year(dteTime))
    insys.wMonth = CInt(Month(dteTime))
    insys.wDay = CInt(Day(dteTime))
    insys.wHour = CInt(Hour(dteTime))
    insys.wMinute = CInt(Minute(dteTime))
    insys.wSecond = CInt(Second(dteTime))

    Call SystemTimeToFileTime(insys, infile)
    Call FileTimeToLocalFileTime(infile, outfile)
    Call FileTimeToSystemTime(outfile, outsys)

    UTCToLocalTime = CDate(outsys.wMonth & "/" & _
      outsys.wDay & "/" & _
      outsys.wYear & " " & _
      outsys.wHour & ":" & _
      outsys.wMinute & ":" & _
      outsys.wSecond)
End Function

'---------------------------------------------------------------------
' Tests for the ISO Date functions
'---------------------------------------------------------------------
Public Sub ISODateTest()
    ' [[ Verify that all dateTime formats parse sucesfully ]]
    Dim d1 As Date: d1 = ISODATE("2011-01-01")
    Dim d2 As Date: d2 = ISODATE("2011-01-01T00:00:00")
    Dim d3 As Date: d3 = ISODATE("2011-01-01T00:00:00Z")
    Dim d4 As Date: d4 = ISODATE("2011-01-01T12:00:00Z")
    Dim d5 As Date: d5 = ISODATE("2011-01-01T12:00:00+05:00")
    Dim d6 As Date: d6 = ISODATE("2011-01-01T12:00:00-05:00")
    Dim d7 As Date: d7 = ISODATE("2011-01-01T12:00:00.05381+05:00")
    AssertEqual "Date and midnight", d1, d2
    AssertEqual "With and without Z", d2, d3
    AssertEqual "With timezone", -5, DateDiff("h", d4, d5)
    AssertEqual "Timezone Difference", 10, DateDiff("h", d5, d6)
    AssertEqual "Ignore subsecond", d5, d7

    ' [[ Independence of local DST ]]
    ' Verify that a date in winter and a date in summer parse to the same Hour value
    Dim w As Date: w = ISODATE("2010-02-23T21:04:48+01:00")
    Dim s As Date: s = ISODATE("2010-07-23T21:04:48+01:00")
    AssertEqual "Winter/Summer hours", Hour(w), Hour(s)

    MsgBox "All tests passed succesfully!"
End Sub

Sub AssertEqual(name, x, y)
    If x <> y Then Err.Raise 1234, Description:="Failed: " & name & ": '" & x & "' <> '" & y & "'"
End Sub

ต้องเพิ่มPtrSafeก่อนทุกครั้งDeclareในระบบของฉัน
รามัน

1
ใช่ไม่ได้ผล หากคุณเพิ่มการทดสอบDim d8 As Date: d8 = ISODATE("2020-01-02T16:46:00")ที่เป็นวันที่ ISO ที่ถูกต้องสำหรับวันที่ 2 มกราคมบิตจะส่งคืนวันที่ 1 กุมภาพันธ์ ... การทดสอบของคุณมองโลกในแง่ดีมาก
Liam

5

ฉันจะโพสต์สิ่งนี้เป็นความคิดเห็น แต่ฉันมีตัวแทนไม่เพียงพอ - ขออภัย!. สิ่งนี้มีประโยชน์มากสำหรับฉัน - ขอบคุณ rix0rrr แต่ฉันสังเกตเห็นว่าฟังก์ชัน UTCToLocalTime จำเป็นต้องคำนึงถึงการตั้งค่าภูมิภาคเมื่อสร้างวันที่ในตอนท้าย นี่คือเวอร์ชันที่ฉันใช้ในสหราชอาณาจักรโปรดทราบว่าลำดับของ wDay และ wMonth จะกลับรายการ:

Public Function UTCToLocalTime(dteTime As Date) As Date
  Dim infile As FILETIME
  Dim outfile As FILETIME
  Dim insys As SYSTEMTIME
  Dim outsys As SYSTEMTIME

  insys.wYear = CInt(Year(dteTime))
  insys.wMonth = CInt(Month(dteTime))
  insys.wDay = CInt(Day(dteTime))
  insys.wHour = CInt(Hour(dteTime))
  insys.wMinute = CInt(Minute(dteTime))
  insys.wSecond = CInt(Second(dteTime))

  Call SystemTimeToFileTime(insys, infile)
  Call FileTimeToLocalFileTime(infile, outfile)
  Call FileTimeToSystemTime(outfile, outsys)

  UTCToLocalTime = CDate(outsys.wDay & "/" & _
    outsys.wMonth & "/" & _
    outsys.wYear & " " & _
    outsys.wHour & ":" & _
    outsys.wMinute & ":" & _
    outsys.wSecond)
  End Function

ฉันต้องการชี้ให้เห็นว่าผู้เขียนถามเกี่ยวกับสตริงวันที่และเวลาที่จัดรูปแบบ ISO8601 ซึ่งสอดคล้องกันในการจัดลำดับฟิลด์ แน่นอนมันเป็นเรื่องที่ดีที่คุณทำงานสำหรับข้อมูลของคุณ แต่ถ้าคนอื่นอ่านนี้และจะสับสนคุณควรตรวจสอบen.wikipedia.org/wiki/ISO_8601และxkcd.com/1179
Hovis Biddle

2
โว้ว! ระเบิดจากอดีต อย่างไรก็ตามฉันไม่ได้เปลี่ยนแปลงอะไรเกี่ยวกับลำดับฟิลด์ของวันที่ ISO เป็นเวอร์ชันท้องถิ่นที่ต้องปฏิบัติตามอนุสัญญาท้องถิ่น ตามหลักการแล้วรหัสควรคิดออก แต่ฉันบอกว่านี่มีไว้สำหรับใช้ในสหราชอาณาจักร ...
dsl101

2

คำตอบโดยrix0rrrดีมาก แต่มันไม่สนับสนุนการชดเชยโซนเวลาโดยไม่ต้องลำไส้ใหญ่หรือมีเพียงไม่กี่ชั่วโมง ฉันปรับปรุงฟังก์ชันเล็กน้อยเพื่อเพิ่มการรองรับรูปแบบเหล่านี้:

'---------------------------------------------------------------------
' Declarations must be at the top -- see below
'---------------------------------------------------------------------
Public Declare Function SystemTimeToFileTime Lib _
  "kernel32" (lpSystemTime As SYSTEMTIME, _
  lpFileTime As FILETIME) As Long

Public Declare Function FileTimeToLocalFileTime Lib _
  "kernel32" (lpLocalFileTime As FILETIME, _
  lpFileTime As FILETIME) As Long

Public Declare Function FileTimeToSystemTime Lib _
  "kernel32" (lpFileTime As FILETIME, lpSystemTime _
  As SYSTEMTIME) As Long

Public Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Public Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

'---------------------------------------------------------------------
' Convert ISO8601 dateTimes to Excel Dates
'---------------------------------------------------------------------
Public Function ISODATE(iso As String)
    ' Find location of delimiters in input string
    Dim tPos As Integer: tPos = InStr(iso, "T")
    If tPos = 0 Then tPos = Len(iso) + 1
    Dim zPos As Integer: zPos = InStr(iso, "Z")
    If zPos = 0 Then zPos = InStr(iso, "+")
    If zPos = 0 Then zPos = InStr(tPos, iso, "-")
    If zPos = 0 Then zPos = Len(iso) + 1
    If zPos = tPos Then zPos = tPos + 1

    ' Get the relevant parts out
    Dim datePart As String: datePart = Mid(iso, 1, tPos - 1)
    Dim timePart As String: timePart = Mid(iso, tPos + 1, zPos - tPos - 1)
    Dim dotPos As Integer: dotPos = InStr(timePart, ".")
    If dotPos = 0 Then dotPos = Len(timePart) + 1
    timePart = Left(timePart, dotPos - 1)

    ' Have them parsed separately by Excel
    Dim d As Date: d = DateValue(datePart)
    Dim t As Date: If timePart <> "" Then t = TimeValue(timePart)
    Dim dt As Date: dt = d + t

    ' Add the timezone
    Dim tz As String: tz = Mid(iso, zPos)
    If tz <> "" And Left(tz, 1) <> "Z" Then
        Dim colonPos As Integer: colonPos = InStr(tz, ":")
        Dim minutes As Integer
        If colonPos = 0 Then
            If (Len(tz) = 3) Then
                minutes = CInt(Mid(tz, 2)) * 60
            Else
                minutes = CInt(Mid(tz, 2, 5)) * 60 + CInt(Mid(tz, 4))
            End If
        Else
            minutes = CInt(Mid(tz, 2, colonPos - 2)) * 60 + CInt(Mid(tz, colonPos + 1))
        End If

        If Left(tz, 1) = "+" Then minutes = -minutes
        dt = DateAdd("n", minutes, dt)
    End If

    ' Return value is the ISO8601 date in the local time zone
    dt = UTCToLocalTime(dt)
    ISODATE = dt
End Function

'---------------------------------------------------------------------
' Got this function to convert local date to UTC date from
' http://excel.tips.net/Pages/T002185_Automatically_Converting_to_GMT.html
'---------------------------------------------------------------------
Public Function UTCToLocalTime(dteTime As Date) As Date
    Dim infile As FILETIME
    Dim outfile As FILETIME
    Dim insys As SYSTEMTIME
    Dim outsys As SYSTEMTIME

    insys.wYear = CInt(Year(dteTime))
    insys.wMonth = CInt(Month(dteTime))
    insys.wDay = CInt(Day(dteTime))
    insys.wHour = CInt(Hour(dteTime))
    insys.wMinute = CInt(Minute(dteTime))
    insys.wSecond = CInt(Second(dteTime))

    Call SystemTimeToFileTime(insys, infile)
    Call FileTimeToLocalFileTime(infile, outfile)
    Call FileTimeToSystemTime(outfile, outsys)

    UTCToLocalTime = CDate(outsys.wMonth & "/" & _
      outsys.wDay & "/" & _
      outsys.wYear & " " & _
      outsys.wHour & ":" & _
      outsys.wMinute & ":" & _
      outsys.wSecond)
End Function

'---------------------------------------------------------------------
' Tests for the ISO Date functions
'---------------------------------------------------------------------
Public Sub ISODateTest()
    ' [[ Verify that all dateTime formats parse sucesfully ]]
    Dim d1 As Date: d1 = ISODATE("2011-01-01")
    Dim d2 As Date: d2 = ISODATE("2011-01-01T00:00:00")
    Dim d3 As Date: d3 = ISODATE("2011-01-01T00:00:00Z")
    Dim d4 As Date: d4 = ISODATE("2011-01-01T12:00:00Z")
    Dim d5 As Date: d5 = ISODATE("2011-01-01T12:00:00+05:00")
    Dim d6 As Date: d6 = ISODATE("2011-01-01T12:00:00-05:00")
    Dim d7 As Date: d7 = ISODATE("2011-01-01T12:00:00.05381+05:00")
    Dim d8 As Date: d8 = ISODATE("2011-01-01T12:00:00-0500")
    Dim d9 As Date: d9 = ISODATE("2011-01-01T12:00:00-05")
    AssertEqual "Date and midnight", d1, d2
    AssertEqual "With and without Z", d2, d3
    AssertEqual "With timezone", -5, DateDiff("h", d4, d5)
    AssertEqual "Timezone Difference", 10, DateDiff("h", d5, d6)
    AssertEqual "Ignore subsecond", d5, d7
    AssertEqual "No colon in timezone offset", d5, d8
    AssertEqual "No minutes in timezone offset", d5, d9

    ' [[ Independence of local DST ]]
    ' Verify that a date in winter and a date in summer parse to the same Hour value
    Dim w As Date: w = ISODATE("2010-02-23T21:04:48+01:00")
    Dim s As Date: s = ISODATE("2010-07-23T21:04:48+01:00")
    AssertEqual "Winter/Summer hours", Hour(w), Hour(s)

    MsgBox "All tests passed succesfully!"
End Sub

Sub AssertEqual(name, x, y)
    If x <> y Then Err.Raise 1234, Description:="Failed: " & name & ": '" & x & "' <> '" & y & "'"
End Sub

2

ฉันรู้ว่ามันไม่สวยหรูเท่าโมดูล VB แต่ถ้ามีคนกำลังมองหาสูตรด่วนซึ่งพิจารณาไทม์โซนหลัง '+' ด้วยก็อาจเป็นได้

= DATEVALUE(MID(D3,1,10))+TIMEVALUE(MID(D3,12,5))+TIME(MID(D3,18,2),0,0)

จะเปลี่ยน

2017-12-01T11:03+1100

ถึง

2/12/2017 07:03:00 AM

(เวลาท้องถิ่นโดยพิจารณาจากเขตเวลา)

เห็นได้ชัดว่าคุณสามารถปรับเปลี่ยนความยาวของส่วนการตัดแต่งที่แตกต่างกันได้ถ้าคุณมีมิลลิวินาทีเช่นกันหรือถ้าคุณมีเวลานานกว่า +

ใช้sigpwnedสูตรหากคุณต้องการละเว้นเขตเวลา


2

คุณสามารถทำได้โดยไม่มี VB สำหรับแอปพลิเคชัน:

เช่นเพื่อแยกวิเคราะห์สิ่งต่อไปนี้:

2011-01-01T12:00:00+05:00
2011-01-01T12:00:00-05:00

ทำ:

=IF(MID(A1,20,1)="+",TIMEVALUE(MID(A1,21,5))+DATEVALUE(LEFT(A1,10))+TIMEVALUE(MID(A1,12,8)),-TIMEVALUE(MID(A1,21,5))+DATEVALUE(LEFT(A1,10))+TIMEVALUE(MID(A1,12,8)))

สำหรับ

2011-01-01T12:00:00Z

ทำ:

=DATEVALUE(LEFT(A1,10))+TIMEVALUE(MID(A1,12,8))

สำหรับ

2011-01-01

ทำ:

=DATEVALUE(LEFT(A1,10))

แต่รูปแบบวันที่ด้านบนควรให้ Excel แยกวิเคราะห์โดยอัตโนมัติ

จากนั้นคุณจะได้รับค่าวันที่ / เวลาของ Excel ซึ่งคุณสามารถจัดรูปแบบเป็นวันที่และเวลาได้

สำหรับข้อมูลโดยละเอียดและไฟล์ตัวอย่าง: http://blog.hani-ibrahim.de/iso-8601-parsing-in-excel-and-calc.html


น่าเสียดายที่ลิงก์สำหรับโซลูชันที่มี Z ในตอนท้ายไม่มีอีกต่อไป @hani - คุณต้องการใส่โซลูชันโดยตรงหรือไม่เพื่อให้คำตอบนี้คงคุณค่าไว้
luksch

1

วันที่ของฉันอยู่ในรูปแบบ 20130221T133551Z (YYYYMMDD'T'HHMMSS'Z ') ดังนั้นฉันจึงสร้างตัวแปรนี้:

Public Function ISODATEZ(iso As String) As Date
    Dim yearPart As Integer: yearPart = CInt(Mid(iso, 1, 4))
    Dim monPart As Integer: monPart = CInt(Mid(iso, 5, 2))
    Dim dayPart As Integer: dayPart = CInt(Mid(iso, 7, 2))
    Dim hourPart As Integer: hourPart = CInt(Mid(iso, 10, 2))
    Dim minPart As Integer: minPart = CInt(Mid(iso, 12, 2))
    Dim secPart As Integer: secPart = CInt(Mid(iso, 14, 2))
    Dim tz As String: tz = Mid(iso, 16)

    Dim dt As Date: dt = DateSerial(yearPart, monPart, dayPart) + TimeSerial(hourPart, minPart, secPart)

    ' Add the timezone
    If tz <> "" And Left(tz, 1) <> "Z" Then
        Dim colonPos As Integer: colonPos = InStr(tz, ":")
        If colonPos = 0 Then colonPos = Len(tz) + 1

        Dim minutes As Integer: minutes = CInt(Mid(tz, 2, colonPos - 2)) * 60 + CInt(Mid(tz, colonPos + 1))
        If Left(tz, 1) = "+" Then minutes = -minutes
        dt = DateAdd("n", minutes, dt)
    End If

    ' Return value is the ISO8601 date in the local time zone
    ' dt = UTCToLocalTime(dt)
    ISODATEZ = dt
End Function

(ไม่ได้ทดสอบการแปลงเขตเวลาและไม่มีการจัดการข้อผิดพลาดในกรณีที่มีการป้อนข้อมูลที่ไม่คาดคิด)


0

หากคุณสามารถแปลงรูปแบบ (คงที่) เพียงบางรูปแบบเป็น UTC ได้คุณสามารถเขียนฟังก์ชันหรือสูตร VBA อย่างง่ายได้

ฟังก์ชัน / สูตรด้านล่างจะใช้ได้กับรูปแบบเหล่านี้ (มิลลิวินาทีจะถูกละไว้):

2011-01-01T12:00:00.053+0500
2011-01-01T12:00:00.05381+0500

ฟังก์ชัน VBA

อีกต่อไปเพื่อการอ่านที่ดีขึ้น:

Public Function CDateUTC(dISO As String) As Date

  Dim d, t, tz As String
  Dim tzInt As Integer
  Dim dLocal As Date

  d = Left(dISO, 10)
  t = Mid(dISO, 12, 8)
  tz = Right(dISO, 5)
  tzInt = - CInt(tz) \ 100
  dLocal = CDate(d & " " & t)

  CDateUTC = DateAdd("h", tzInt, dLocal)    

End Function

... หรือ "oneliner":

Public Function CDateUTC(dISO As String) As Date
  CDateUTC = DateAdd("h", -CInt(Right(dISO, 5)) \ 100, CDate(Left(dISO, 10) & " " & Mid(dISO, 12, 8)))    
End Function

สูตร

=DATEVALUE(LEFT([@ISO], 10)) + TIMEVALUE(MID([@ISO], 12, 8)) - VALUE(RIGHT([@ISO], 5)/100)/24

[@ISO] คือเซลล์ (ภายในตาราง) ที่มีวันที่ / เวลาในเวลาท้องถิ่นในรูปแบบ ISO8601

ทั้งสองจะสร้างค่าประเภทวันที่ / เวลาใหม่ ปรับฟังก์ชั่นตามความต้องการของคุณได้ตามต้องการ (รูปแบบวันที่ / เวลาเฉพาะ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.