Jump to content

Need to convert Excel time values to actual time string


Recommended Posts

I have an Excel file that I want to read and display the dates and times from each row, but the time value is a small decimal number.

I want to convert that number to an actual time string.

The Excel data is:

Col A       Col B    Col C
6/17/2016   1:00:00  Date is 6/17/2015, time is 1:00:00 AM
6/17/2016   1:00:01  Date is 6/17/2015, time is 1:00:01 AM
6/17/2016   2:00:00  Date is 6/17/2015, time is 2:00:00 AM
6/17/2016   3:00:00  Date is 6/17/2015, time is 3:00:00 AM

My test code is:

#include <Excel.au3>

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=THTracker.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=N
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

test()
Func test()
    Local $fn, $ffn, $obj, $ndx, $ndx2, $ar

    $fn = "C:\Util\AutoIT-src\myStuff\THTracker\Copy of 2016 Easton 100.xlsx"
    ConsoleWrite("+++: $fn ==>" & $fn & "<==" & @CRLF)

    $ffn = FileGetShortName($fn, 1)
    ConsoleWrite("+++: $ffn ==>" & $ffn & "<==" & @CRLF)

    $obj = _ExcelBookOpen($ffn, 0, 1) ; open excel in the background
    ConsoleWrite("+++: isObj($obj) = " & IsObj($obj) & @CRLF)

    $ar = _ExcelReadSheetToArray($obj)

    _ExcelBookClose($obj)

    ConsoleWrite("+++: $ar[0][0] = " & $ar[0][0] & @CRLF)
    ConsoleWrite("+++: $ar[0][1] = " & $ar[0][1] & @CRLF)

    For $ndx = 1 To $ar[0][0]
        ConsoleWrite("+++: Date = " & $ar[$ndx][1] & @CRLF)
        ConsoleWrite("+++: Time = " & $ar[$ndx][2] & @CRLF)

        For $ndx2 = 1 To $ar[0][1] - 1
            ConsoleWrite("+++: [" & $ndx & "][" & $ndx2 & "] = " & $ar[$ndx][$ndx2] & @CRLF)
        Next
    Next

EndFunc   ;==>test

The console output is:

+++: $fn ==>C:\Util\AutoIT-src\myStuff\THTracker\Copy of 2016 Easton 100.xlsx<==
+++: $ffn ==>C:\Util\AUTOIT~1\myStuff\THTRAC~1\COPYOF~1.XLS<==
+++: isObj($obj) = 1
+++: $ar[0][0] = 4
+++: $ar[0][1] = 4
+++: Date = 20160617000000
+++: Time = 0.0416666666666667
+++: [1][1] = 20160617000000
+++: [1][2] = 0.0416666666666667
+++: [1][3] = Date is 6/17/2015, time is 1:00:00 AM
+++: Date = 20160617000000
+++: Time = 0.0416782407407407
+++: [2][1] = 20160617000000
+++: [2][2] = 0.0416782407407407
+++: [2][3] = Date is 6/17/2015, time is 1:00:01 AM
+++: Date = 20160617000000
+++: Time = 0.0833333333333333
+++: [3][1] = 20160617000000
+++: [3][2] = 0.0833333333333333
+++: [3][3] = Date is 6/17/2015, time is 2:00:00 AM
+++: Date = 20160617000000
+++: Time = 0.125
+++: [4][1] = 20160617000000
+++: [4][2] = 0.125
+++: [4][3] = Date is 6/17/2015, time is 3:00:00 AM
+>12:52:23 AutoIt3.exe ended.rc:0
+>12:52:23 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 1.206

Note that the time values [n][2] are all decimal values like  0.0416666666666667, 0.125, etc.

Link to comment
Share on other sites

Excel stores the date/time as a number. The fractional part is the time.
Details can be found here: https://www.autoitscript.com/wiki/Excel_UDF#Date_and_Time

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

You could use the Excel date functions to translate date and time in columns A and B to the string in column C:

https://support.office.com/en-us/article/Date-and-time-functions-reference-fd1b5961-c1ae-4677-be58-074152f97b81

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

I found that the date was stored as yyyymmdd  (20000119000000)

The time is stored as a decimal number 

Also, I cannot modify the spreadsheets, so I have to go with what I get.

From the Excel UDF doc:
 

Quote

The fractional portion of the number represents the fractional portion of a 24 hour day. For example, 6:00 AM is stored as 0.25,

How can I convert this fractional time of day to a hh:mm:ss string?

 

Link to comment
Share on other sites

Something like this:

#include <Date.au3>

Local $iTimeStamp = 42465.7260416667 ;= 2016-04-05 17:25:30" = yyyy-mm-dd hh:mm:ss
Local $iDec = $iTimeStamp - Int($iTimeStamp)
Local $Date = _DateAdd("D", Int($iTimeStamp), "1899/12/30 00:00:00")
Local $DateTime = _DateAdd("s", Int($iDec * 24 * 3600), $Date)
MsgBox(0, "Results", "Timestamp: " & $iTimeStamp & " = " & _
StringRegExpReplace($DateTime, "(\d{4})/(\d{2})/(\d{2}) (.*)", "\3-\2-\1 \4") & " in dd/mm/yyyy hh:mm:ss")

 

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

As the cell was only a time value, here's what I came up with:

_GetTime("01:02:03")
_GetTime("05:06")
_GetTime(0.0416666666666667)

Func _GetTime($sCellText)
    Local $ampm, $time = ""

    If ($time == "") _
            And (StringRegExp($sCellText, "^\d{1,2}+[:]\d{1,2}+[:]\d{1,2}$")) Then
        $time = $sCellText; Syntax was hh:mm:ss
    EndIf

    If ($time == "") _
            And (StringRegExp($sCellText, "^\d{1,2}+[:]\d{1,2}+$")) Then
        $time = $sCellText & ":00"; Syntax was hh:mm
    EndIf

    If ($time == "") _
            And ($sCellText <> "") _
            And (((1 + $sCellText) - 1) == $sCellText) Then
        Local $iNum, $x, $hh, $mm, $ss
        ; Cell data was a decimal number like 0.0416666666666667

        $iNum = 24 * 60 * 60
        $x = $iNum * $sCellText
        $ss = Floor(Mod($x, 60))
        $x = Floor($x / 60)
        $mm = Mod($x, 60)
        $hh = Floor($x / 60)

        If ($ss == 59) Then
            ; Fix rounding errors resulting in secs = 59
            $ss = 0
            $mm += 1
            If ($mm == 59) Then
            If ($mm == 59) Then
                $mm = 0
                $hh += 1
            EndIf
        EndIf

        If ($hh > 12) Then ; Change from military time
            $hh -= 12
            $ampm = "PM"
        ElseIf ($hh == 12) Then
            $ampm = "PM"
        Else
            $ampm = "AM"
        EndIf

        $time = StringFormat("%d:%02d %s", $hh, $mm, $ampm)
    EndIf

    ConsoleWrite("+++: $sCellText ==>" & $sCellText & "<==" & @CRLF)
    ConsoleWrite("+++: $time      ==>" & $time & "<==" & @CRLF)
    consolewrite(@crlf)

    Return ($time)
EndFunc   ;==>_GetTime

Thanks for your help.

 

Link to comment
Share on other sites

:)

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

@AndyS01,

Beware that == is a case-sensitive string comparison. You shouldn't use this to compare numbers.

; Cell data was a decimal number like 0.0416666666666667
ConsoleWrite(StringRight(_DateAdd('s', 86400 * $sCellText, '2000/01/01 00:00:00'), 8) & @LF)

 

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...