Jump to content

playing with time


 Share

Recommended Posts

my goal is to change a date from this format: "10/22/2007 4:00:03 PM" to the conformist "10/22/2007 16:00:03"

So, I've finally started to look into Regular Expressions, they're really cool, except when I can't get it to spit out what I want.

$aHour = StringRegExp("10/22/2007 4:00:03 PM", "(?: \d{1,2}\/\d{1,2}\/\d{4}\s)(\d{1,2})", 1)
If IsArray($aHour) Then
    For $hour In $aHour
        ConsoleWrite("Hour: " & $hour & @LF)
    Next

    $aMeridiem = StringRegExp($file, "(?: \d{1,2}\/\d{1,2}\/\d{4}\s\d{1,2}\:\d{1,2}\:\d{2}\s)([AM|PM]{2,2})", 1)
    If IsArray($aMeridiem) Then
        For $Meridiem In $aMeridiem
            ConsoleWrite("Meridiem: " & $Meridiem & @LF)
        Next

        If $Meridiem = "PM"  Then
            $hour += 12
            If $hour > 24 Then $24hour -= 24
            ConsoleWrite("24 hour : " & $24hour & @LF)
            ConsoleWrite("24HR time: " & $lastupdated & @LF)
            $lastupdated = StringRegExpReplace($lastupdated, "(\s[AM|PM]{2,2})", "")
; here's the problem, the hour doesn't get replaced by the 24 hour:
            $lastupdated = StringRegExpReplace($lastupdated, "(\d{1-2})(?: \:\d{1-2}\:\d{2,2})", $24hour)
            ConsoleWrite("error: " & @error & " extended: " & @extended & @LF)
            ConsoleWrite("24HR time: " & $lastupdated & @LF)
        EndIf
    EndIf
EndIf

Here's the deal, I want to download a html file, parse the text for the time, and then, if it's more than 5 minutes old, do a refresh. I know there's probably some easier way to do it, some utility or something, but I've taken this as a lesson with RegExp.

the place where I'm having an issue is with the second StringRegExpReplace, I can't seem to get it right.

Thanks for any help!

"I'm not even supposed to be here today!" -Dante (Hicks)

Link to comment
Share on other sites

An alternative:

#include <date.au3>

MsgBox(0,"",militaryTime("10/22/2007 4:00:03 PM"))

MsgBox(0,"",militaryTime("10/22/2007 14:00:03 AM"))

Func militaryTime($myDateTime)

    Local $myDate, $myTime

    _DateTimeSplit ( $myDateTime, $myDate, $myTime )

    Switch StringRight($myDateTime, 2)
        Case "AM"
            ;If hour is greater than 12 but is designated as AM, subtract 12
            If $myTime[1] >= 12 Then
                $myTime[1] -= 12
            EndIf
        Case "PM"
            ;If hour is less than 12 and designated as PM, add 12
            If $myTime[1] <= 12 Then
                $myTime[1] += 12
            EndIf
    EndSwitch
    
    Return $myDate[1] & "/" & $myDate[2] & "/" & $myDate[3] & " " & $myTime[1] & ":" & $myTime[2] & ":" & $myTime[3]
EndFunc
Edited by weaponx
Link to comment
Share on other sites

  • Moderators

Here... since your were trying to use RegExp... here's something a bit different than what weaponx proposed:

MsgBox(0, 0, _MilitaryTime("10/22/2007 4:00:03 PM"))

Func _MilitaryTime($sString)
    Local $aHour, $aSRE
    $aSRE = StringRegExp($sString, "(?i)(\d+\/\d+\/\d+)\s(\d+):(\d+:\d+)\s(AM|PM)", 3)
    If IsArray($aSRE) = 0 Or UBound($aSRE) - 1 <> 3 Then Return SetError(1, 0, "")
    If $aSRE[3] = "PM" Then
        If Int($aSRE[1]) = 12 Then
            $sHour = 12
        Else
            $sHour = Int($aSRE[1]) + 12
        EndIf
    Else
        If Int($aSRE[1]) = 12 Then
            $sHour = "00"
        Else
            $sHour = StringFormat("%02d", $aSRE[1])
        EndIf
    EndIf
    Return StringRegExpReplace($sString,"(?i)(\d+\/\d+\/\d+)\s(\d+):(\d+:\d+)\s(AM|PM)", _
        $aSRE[0] & " " & $sHour & ":" & $aSRE[2])
EndFunc

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Link to comment
Share on other sites

Excellent! I'll try those out tomorrow at work, meanwhile, I realized that there's more to do to make it match the date.au3 functions, the year needs to be at the front, like this: "2007/10/22 16:00:03"

Can regexp replace do that?

"I'm not even supposed to be here today!" -Dante (Hicks)

Link to comment
Share on other sites

  • Moderators

Excellent! I'll try those out tomorrow at work, meanwhile, I realized that there's more to do to make it match the date.au3 functions, the year needs to be at the front, like this: "2007/10/22 16:00:03"

Can regexp replace do that?

Not much you can't do with string manipulations and regular expressions.

Using regular code tags to try and break the sad.gif in code:

MsgBox(0, "My Way", _MilitaryTime("10/22/2007 4:00:03 PM"))
MsgBox(0, "Year in front", _MilitaryTime("10/22/2007 4:00:03 PM", 1))

Func _MilitaryTime($sString, $nYearFront = 0)
    Local $aHour, $aSRE
    $aSRE = StringRegExp($sString, "(?i)(\d+\/\d+)\/(\d+)\s(\d+):(\d+:\d+)\s(AM|PM)", 3)
    If IsArray($aSRE) = 0 Or UBound($aSRE) - 1 <> 4 Then Return SetError(1, 0, "")
    If $aSRE[4] = "PM" Then
        If Int($aSRE[2]) = 12 Then
            $sHour = 12
        Else
            $sHour = Int($aSRE[2]) + 12
        EndIf
    Else
        If Int($aSRE[2]) = 12 Then
            $sHour = "00"
        Else
            $sHour = StringFormat("%02d", $aSRE[2])
        EndIf
    EndIf
    If $nYearFront Then 
            Return StringRegExpReplace($sString,"(?i)(\d+\/\d+)\/(\d+)\s(\d+):(\d+:\d+)\s(AM|PM)", _
                $aSRE[1] & "/" & $aSRE[0] & " " & $sHour & ":" & $aSRE[3])
    EndIf
    Return StringRegExpReplace($sString,"(?i)(\d+\/\d+\/)(\d+)\s(\d+):(\d+:\d+)\s(AM|PM)", _
        $aSRE[0] & "/" & $aSRE[1] & " " & $sHour & ":" & $aSRE[3])
EndFunc
Edited by SmOke_N

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...