Time.au3

Last modified:   Thursday, 13 November 2008

;*******************************************************************************
;
;   Function List
;         _Time()
;         _Time_12Hour()
;         _Time_CurrentDisp()
;         _Time_DST_Bias()
;         _Time_FormatLocal()
;         _Time_InRange()
;         _Time_UTC_Offset()
;
;*******************************************************************************

#include-once

;===============================================================================
; Function Name:     _Time()
; Description:   Return the system time formatted according to your regional settings
; Syntax:   _Time([include seconds[, Time format (12|24 hr)]])
; Parameter(s):   $iSec - whether to include the seconds in the output display
;                         0 - (default) don't include, anything except 0 - include
;                 $tFormat - type of return (12 or 24 hour) default = 12
;
; Requirement(s):   
; Return Value(s):   Formatted system time string (localized)
; Author(s):     George (GEOSoft) Gedye with thanks to Valuater
; Modification(s):   
; Note(s):    This is just a variation of _Time_12Hour() that allows you to return
;             a localized time in either 12 or 24 hour format.
;             To convert a time other than system time, see 
; Example(s):
#cs
   MsgBox(0, "TEST", _Time(1, 24)) ;; Include the seconds in 24 Hr. format
   MsgBox(0, "TEST", _Time(1) ;; Include the seconds in 12 Hr. format with AM\PM added
   MsgBox(0, "TEST", _Time() ;; 12 Hr. format without the seconds with AM\PM added (default)
#ce
;===============================================================================

Func _Time($iSec = 0, $tFormat = 12)
  Local $fKey = "HKCU\Control Panel\International", $ap = RegRead($fKey, "s1159")
  Local $pStr = RegRead($fKey, "s2359"), $tSep = RegRead($fKey, "sTime"), $sStr = ""
  Local $hour = @Hour
  If $tFormat = 12 Then
    If $hour = 0 Then $hour = 12
    If @Hour >= 12 Then
      $hour = @Hour
      If $hour > 12 Then $hour -= 12
      $ap = $pStr
    EndIf
  Else
    $ap = ""
    $hour = StringFormat("%02d",$hour)
  EndIf
  If $iSec <> 0 Then $sStr = $tSep & @Sec
  If $ap <> "" Then $ap = Chr(32) & $ap
  Return $hour & $tSep & @Min & $sStr & $ap
EndFunc ;<==> _Time()

;===============================================================================
; Function Name:     _Time_12Hour()
; Description:   Return the time formatted according to your regional settings
; Syntax:   _Time_12Hour([include seconds])
; Parameter(s):   $iSec - whether to include the seconds in the output display
;                         0 - (default) don't include, anything except 0 - include
; Requirement(s):   
; Return Value(s):   Formatted time string
; Author(s):     GEOSoft with thanks to Valuater for helping shorten the code
;                                    as well as good advice. That's one more I owe him.
; Modification(s):   
; Note(s):    
; Example(s):   MsgBox(0, "TEST", _Time_12Hour(1))
;===============================================================================

Func _Time_12Hour($iSec = 0)
  Local $fKey = "HKCU\Control Panel\International", $ap = RegRead($fKey, "s1159")
  Local $pStr = RegRead($fKey, "s2359"), $tSep = RegRead($fKey, "sTime"), $sStr = ""
  Local $hour = @Hour
  If $hour = 0 Then $hour = 12
  If @Hour >= 12 Then
    $hour = @Hour
    If $hour > 12 Then $hour -= 12
    $ap = $pStr
  EndIf
  If $iSec <> 0 Then $sStr = $tSep & @Sec
  Return $hour & $tSep & @Min & $sStr & Chr(32) & $ap
EndFunc ;<==> _Time_12Hour()

;===============================================================================
; Function Name:     _Time_CurrentDisp()
; Description:   Returns the current setting (Daylight or Standard)
; Syntax:         
; Parameter(s):   
; Requirement(s):   
; Return Value(s):   
; Author(s):   George (GEOSoft) Gedye
; Modification(s):   
; Note(s):    
; Example(s):   
;===============================================================================

Func _Time_CurrentDisp()
  Local $dMth, $sMth, $dDay, $sDay
  $objT_Zone = ObjGet("winmgmts:\\localhost\root\CIMV2")
  If IsObj ($objT_Zone) Then
    $tzItems = $objT_Zone.ExecQuery("SELECT * FROM Win32_TimeZone", "WQL",0x10 + 0x20)
    If IsObj($tzItems) Then
      For $objItem In $tzItems
        With $objItem
          $dMth = .DaylightMonth 
          $sMth = .StandardMonth
          $dDay = .DaylightDay
          $sDay = .StandardDay +1
        EndWith
        If (@Mon >= $dMth And @Mday >= $dDay) AND (@Mon <= $sMth And @MDay <= $sDay) Then
          Return $objItem.StandardName
        Else
          Return $objItem.DaylightName
        EndIf
      Next
    Else
      Return SetError(1)
    EndIf
  Else
    Return SetError(1)
  EndIf
EndFunc   ;<==> _Time_CurrentDisp()

;===============================================================================
; Function Name:     _Time_DST_Bias()
; Description:   Determine the Daylight Savings Time offset
; Syntax:         _Time_DST_Bias([return in hours])
; Parameter(s):   $hr - If 0 (default) then returns in minutes else returns in hours
; Requirement(s):   
; Return Value(s):   Success - Daylight savings time offset (usually 1 hour)
;                    Failure - Sets @Error to 1 if an object could not be connected
; Author(s):   George (GEOSoft) Gedye
; Modification(s):   
; Note(s):    
; Example(s):   
;===============================================================================

Func _Time_DST_Bias($hr = 0)
  $objT_Zone = ObjGet("winmgmts:\\localhost\root\CIMV2")
  If IsObj ($objT_Zone) Then
    $tzItems = $objT_Zone.ExecQuery("SELECT * FROM Win32_TimeZone", "WQL", 0x10 + 0x20)
    If IsObj($tzItems) Then
      For $objItem In $tzItems
        $dsBias = $objItem.DaylightBias
        If $hr <> 0 Then $dsBias /= 60
        Return $dsBias
      Next
    Else
      Return SetError(1)
    EndIf
  Else
    Return SetError(1)
  EndIf
EndFunc   ;<==> _Time_DST_Bias()

;===============================================================================
; Function Name:   _Time_FormatLocal()
; Description:     
; Syntax:          
; Parameter(s):    
; Requirement(s):  
; Return Value(s): - Success 
;                  - Failure 
; Author(s):       George (GEOSoft) Gedye
; Modification(s): 
; Note(s):    
; Example(s):   
#cs
   MsgBox(262208, "TIME", _Time_FormatLocal(@Hour & @Min & @Sec))
   MsgBox(262208, "TIME", _Time_FormatLocal(@Hour & "h" & @Min & ":" & @Sec))
#ce
;===============================================================================

Func _Time_FormatLocal()
   Local $sFormat = RegRead("HKCU\Control Panel\International", "sTimeFormat")
   If @Error Then $sFormat = "h:mm:ss tt"
   Local $aFormat = StringRegExp($sFormat,"\w*(.)\w*(.).*", 3)
   Return StringRegExpReplace($sTime, "(\d{2}).?(\d{2}).?(\d{2})", "\1" & $aFormat[0] & "\2" & $aFormat[1] & "\3")
EndFunc   ;<==> _Time_FormatLocal()

;===============================================================================
; Function Name:   _Time_InRange()
; Description:     Determine if the current time is within a given Range
; Syntax:          _Time_InRange("Low time", "High time")
; Parameter(s):    $sTime - Low end of the range (Start time)
;                  $eTime - High end of the range (End time)
; Requirement(s):   
; Return Value(s): 1 if current time is within the range otherwise 0
; Author(s):   George (GEOSoft) Gedye
; Modification(s): Replaced _NowTime(4) With Formatted @Hour & @Min
; Note(s):    This only uses Hours and Minutes
; Example(s):   MsgBox(0, "Time is good", _Time_InRange("08:00", "23:59"))
;===============================================================================

Func _Time_InRange($sTime, $eTime)
  Local $vRange = 0, $cTime
  $cTime = Number(@Hour & @Min)
  If $cTime >= Number(StringFormat("%04d",StringRegExpReplace($sTime, "\D", ""))) AND _
      $cTime <= Number(StringFormat("%04d",StringRegExpReplace($eTime, "\D", ""))) Then $vRange = 1
  Return $vRange
EndFunc   ;<==> _Time_InRange()

;===============================================================================
; Function Name:     _Time_UTC_Offset()
; Description:   Retrieve the offset from GMT
; Syntax:   _Time_UTC_Offset([return in hours])
; Parameter(s):   $hr - If 0 (default) then returns in minutes else returns in hours
; Requirement(s):   
; Return Value(s):   Success - Time zone offset
;                    Failure - Sets @Error to 1 if an object could not be connected
; Author(s):   George (GEOSoft) Gedye
; Modification(s):   
; Note(s):    
; Example(s):   
;===============================================================================

Func _Time_UTC_Offset($hr = 0)
  $objT_Zone = ObjGet("winmgmts:\\localhost\root\CIMV2")
  If IsObj ($objT_Zone) Then
    $tzItems = $objT_Zone.ExecQuery("SELECT * FROM Win32_TimeZone", "WQL", 0x10 + 0x20)
    If IsObj($tzItems) Then
      For $objItem In $tzItems
        $utcOffset = $objItem.Bias
        If $hr <> 0 Then $utcOffset /= 60
        Return $utcOffset
      Next
    Else
      Return SetError(1)
    EndIf
  Else
    Return SetError(1)
  EndIf
EndFunc ;<==> _Time_UTC_Offset()