Excel에서 ISO8601 날짜 / 시간 (TimeZone 포함) 구문 분석

rix0rrr

Excel / VBA에 포함 된 시간대 (외부 소스에서)를 사용하여 ISO8601 날짜 / 시간 형식을 일반 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
rix0rrr

많은 인터넷 검색에서 아무것도 나오지 않아서 나만의 루틴을 작성합니다. 향후 참조를 위해 여기에 게시 :

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자바 8 날짜 및 시간 : 콜론없이 구문 분석 ISO 8601 문자열 오프셋에서

분류에서Dev

Excel에서 날짜 / 시간 형식 구문 분석

분류에서Dev

C ++ 날짜 문자열에서 TimeZone 구문 분석

분류에서Dev

Linux 날짜 명령으로 ISO8601 날짜를 구문 분석하는 방법

분류에서Dev

TimeZone 정보로 날짜 시간을 구문 분석하는 방법

분류에서Dev

xlsx 가져 오기에서 날짜 및 시간 구문 분석

분류에서Dev

MATLAB에서 24 시간으로 날짜 구문 분석

분류에서Dev

스칼라에서 날짜 구문 분석 (Java 시간 API)

분류에서Dev

Objective-C에서 ISO 8601 날짜를 구문 분석하는 방법

분류에서Dev

분수 두 번째 부분이있는 두 ISO8601 날짜 간의 시차

분류에서Dev

Python에서 다른 단어도 포함하는 문자열에서 날짜 시간을 구문 분석하는 방법

분류에서Dev

SMS 날짜 / 시간 구문 분석

분류에서Dev

Spark DataSet 날짜 시간 구문 분석

분류에서Dev

ISO8601 변환기에 대한 가장 빠른 날짜 시간

분류에서Dev

시간, 날짜 / 시간 또는 날짜 구문 분석

분류에서Dev

Luxon에서 기간과 같은 ISO 8601 구문 분석

분류에서Dev

Java / JavaScript에서 ISO-8601 기간 구문 분석

분류에서Dev

구문 분석 문자열에 시간 포함

분류에서Dev

NodaTime을 사용하여 BST 및 GMT를 포함하는 날짜 및 시간 문자열 구문 분석

분류에서Dev

joda-time을 사용하여 시간대가 포함 된 날짜 문자열 구문 분석

분류에서Dev

'T'및 + 시간대 오프셋을 포함하는 날짜 문자열 구문 분석

분류에서Dev

팬더에서 특정 날짜 및 시간 순서 구문 분석

분류에서Dev

Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

분류에서Dev

Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

분류에서Dev

어떻게 자바에서 수정 '날짜 시간 구문 분석 예외'로

분류에서Dev

Pandas 데이터 프레임에서 날짜 시간 구문 분석

분류에서Dev

C #의 lmStat에서 사용자 지정 날짜 시간 구문 분석

분류에서Dev

Python에서 시간대로 날짜를 올바르게 구문 분석

분류에서Dev

Excel 스프레드 시트 셀에서 비표준 날짜 / 시간 데이터 구문 분석

Related 관련 기사

  1. 1

    자바 8 날짜 및 시간 : 콜론없이 구문 분석 ISO 8601 문자열 오프셋에서

  2. 2

    Excel에서 날짜 / 시간 형식 구문 분석

  3. 3

    C ++ 날짜 문자열에서 TimeZone 구문 분석

  4. 4

    Linux 날짜 명령으로 ISO8601 날짜를 구문 분석하는 방법

  5. 5

    TimeZone 정보로 날짜 시간을 구문 분석하는 방법

  6. 6

    xlsx 가져 오기에서 날짜 및 시간 구문 분석

  7. 7

    MATLAB에서 24 시간으로 날짜 구문 분석

  8. 8

    스칼라에서 날짜 구문 분석 (Java 시간 API)

  9. 9

    Objective-C에서 ISO 8601 날짜를 구문 분석하는 방법

  10. 10

    분수 두 번째 부분이있는 두 ISO8601 날짜 간의 시차

  11. 11

    Python에서 다른 단어도 포함하는 문자열에서 날짜 시간을 구문 분석하는 방법

  12. 12

    SMS 날짜 / 시간 구문 분석

  13. 13

    Spark DataSet 날짜 시간 구문 분석

  14. 14

    ISO8601 변환기에 대한 가장 빠른 날짜 시간

  15. 15

    시간, 날짜 / 시간 또는 날짜 구문 분석

  16. 16

    Luxon에서 기간과 같은 ISO 8601 구문 분석

  17. 17

    Java / JavaScript에서 ISO-8601 기간 구문 분석

  18. 18

    구문 분석 문자열에 시간 포함

  19. 19

    NodaTime을 사용하여 BST 및 GMT를 포함하는 날짜 및 시간 문자열 구문 분석

  20. 20

    joda-time을 사용하여 시간대가 포함 된 날짜 문자열 구문 분석

  21. 21

    'T'및 + 시간대 오프셋을 포함하는 날짜 문자열 구문 분석

  22. 22

    팬더에서 특정 날짜 및 시간 순서 구문 분석

  23. 23

    Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

  24. 24

    Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

  25. 25

    어떻게 자바에서 수정 '날짜 시간 구문 분석 예외'로

  26. 26

    Pandas 데이터 프레임에서 날짜 시간 구문 분석

  27. 27

    C #의 lmStat에서 사용자 지정 날짜 시간 구문 분석

  28. 28

    Python에서 시간대로 날짜를 올바르게 구문 분석

  29. 29

    Excel 스프레드 시트 셀에서 비표준 날짜 / 시간 데이터 구문 분석

뜨겁다태그

보관