Unix-Timestamp -> RFC822

  • Ein wunderschöne Tageszeit wünsche ich euch,

    ich bin Autoit - Neuling und wundere mich, dass es scheinbar keine Methode gibt um einen Unix-Timestamp in ein RFC822 Datum umzuwandeln oder kann ich es nur nicht finden? Hat vielleicht einer so etwas in der Hinterhand?

    Für das lokale Datum gibt es diese Methode:

    Code
    Local $tLocalTime = _Date_Time_GetLocalTime(), $aLocalTime = _Date_Time_SystemTimeToArray($tLocalTime)
    	Local $tSystemTime = _Date_Time_GetSystemTime(), $aSystemTime = _Date_Time_SystemTimeToArray($tSystemTime)
    	Local $sRFC822Date = StringFormat('%s, %02d %s %2d %02d:%02d:%02d %+03d00',_DateDayOfWeek($aLocalTime[7] + 1, 1), $aLocalTime[1], StringLeft(_DateToMonth($aLocalTime[0], 1),3), $aLocalTime[2], $aLocalTime[3], $aLocalTime[4], $aLocalTime[5], $aLocalTime[3] - $aSystemTime[3])
    	$tLocalTime = ''
    	$tSystemTime = ''
    	Return $sRFC822Date
    EndFunc
  • Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; AutoIt Version: 3.2.3.0
    ; Language: English
    ; Description: Dll wrapper functions for dealing with Unix timestamps.
    ; Requirement(s): CrtDll.dll
    ; Notes: If CrtDll.dll is not available then functions will return false
    ; and set @error = 99.
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: _TimeGetStamp - Get current time as Unix timestamp value.
    ; Parameter(s): None
    ; Return Value(s): On Success - Returns Unix timestamp
    ; On Failure - Returns False, sets @error = 99
    ; Author(s): Rob Saunders ([email='admin@therks.com'][/email])
    ; User Calltip: _TimeGetStamp() - Get current time as Unix timestamp value. (required: <_UnixTime.au3>)
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _TimeGetStamp()
    Local $av_Time
    $av_Time = DllCall('CrtDll.dll', 'long:cdecl', 'time', 'ptr', 0)
    If @error Then
    SetError(99)
    Return False
    EndIf
    Return $av_Time[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: _TimeMakeStamp - Create Unix timestamp from input values.
    ; Syntax: _TimeMakeStamp( [ second [, minute [, hour [, day [, month [, year [, isDST ]]]]]]] )
    ; Parameter(s): Second - Second for timestamp (0 - 59)
    ; Minute - Minute for timestamp (0 - 59)
    ; Hour - Hour for timestamp (0 - 23)
    ; Day - Day for timestamp (1 - 31)
    ; Month - Month for timestamp (1 - 12)
    ; Year - Year for timestamp (1970 - 2038)
    ; * All the above values default to the 'Default' keyword, where the current
    ; time/date value will be used.
    ; IsDST - Set to 1 during Daylight Saving Time (DST)
    ; - Set to 0 not during DST
    ; - Set to -1 if unknown, function will try to figure it out
    ; - Default is -1
    ; Return Value(s): On Success - Returns Unix timestamp
    ; On Failure - Parameter error, returns -1
    ; - Dll error, returns False, sets @error = 99
    ; Notes: The function will try and calculate dates for numbers outside of the
    ; usual range.
    ; For example: _TimeMakeStamp(0, 0, 0, 32, 1, 1995)
    ; 32nd day of January? Obviously that's not a valid date, but the function
    ; automatically calculates this to be February 1st. A date of 0 will return
    ; the last day of the previous month.
    ; User CallTip: _TimeMakeStamp($i_Sec = Default, $i_Min = Default, $i_Hour = Default, $i_Day = Default, $i_Mon = Default, $i_Year = Default, $i_IsDST = -1) - Create a UNIX timestamp from input values. (required: <_UnixTime.au3>)
    ; Author(s): Rob Saunders ([email='admin@therks.com'][/email])
    ;
    ;===============================================================================
    Func _TimeMakeStamp($i_Sec = Default, $i_Min = Default, $i_Hour = Default, $i_Day = Default, $i_Mon = Default, $i_Year = Default, $i_IsDST = -1)
    Local $struct_Time, $ptr_Time, $av_Time
    $struct_Time = DllStructCreate('uint;uint;uint;uint;uint;uint;uint;uint;uint')

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $i_Sec = Default
    $i_Sec = @SEC
    ContinueCase
    Case $i_Min = Default
    $i_Min = @MIN
    ContinueCase
    Case $i_Hour = Default
    $i_Hour = @HOUR
    ContinueCase
    Case $i_Day = Default
    $i_Day = @MDAY
    ContinueCase
    Case $i_IsDST = Default
    $i_IsDST = -1
    EndSelect
    ; The following is done because the mktime function demands
    ; that the month be in 0-11 (Jan = 0) format instead of 1-12.
    Select
    Case $i_Mon = Default
    $i_Mon = (@MON - 1)
    Case $i_Mon <> Default
    $i_Mon -= 1
    EndSelect
    ; The following is done because the mktime function expects the year in format
    ; (full year - 1900), thus 99 = 1999 and 100 = 2005. The function will try
    ; to figure out what year the user is trying to use. Thus if the function recieves
    ; 70, it's untouched, but if the user gives 1970, 1900 is subtracted automatically.
    ; Any year above 99 has 1900 automatically subtracted.
    Select
    Case $i_Year = Default
    $i_Year = (@YEAR - 1900)
    Case $i_Year < 70
    $i_Year += 100
    Case $i_Year > 99
    $i_Year -= 1900
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($struct_Time, 1, $i_Sec)
    DllStructSetData($struct_Time, 2, $i_Min)
    DllStructSetData($struct_Time, 3, $i_Hour)
    DllStructSetData($struct_Time, 4, $i_Day)
    DllStructSetData($struct_Time, 5, $i_Mon)
    DllStructSetData($struct_Time, 6, $i_Year)
    DllStructSetData($struct_Time, 9, $i_IsDST)

    [/autoit] [autoit][/autoit] [autoit]

    $ptr_Time = DllStructGetPtr($struct_Time)
    $av_Time = DllCall('CrtDll.dll', 'long:cdecl', 'mktime', 'ptr', $ptr_Time)
    If @error Then
    SetError(99)
    Return False
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $av_Time[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: _StringFormatTime - Get a string representation of a timestamp
    ; according to the format string given to the function.
    ; Syntax: _StringFormatTime( "format" [, timestamp [, max length ]] )
    ; Parameter(s): Format String - A format string to convert the timestamp to.
    ; See notes for some of the values that can be
    ; used in this string.
    ; Timestamp - A timestamp to format, possibly returned from
    ; _TimeMakeStamp. If left empty, default, or less
    ; than 0, the current time is used. (default is -1)
    ; Max Length - Maximum length of the string to be returned.
    ; Default is 255.
    ; Return Value(s): On Success - Returns string formatted timestamp.
    ; On Failure - Returns False, sets @error = 99
    ; Requirement(s): _TimeGetStamp
    ; Notes: The date/time specifiers for the Format String:
    ; %a - Abbreviated weekday name (Fri)
    ; %A - Full weekday name (Friday)
    ; %b - Abbreviated month name (Jul)
    ; %B - Full month name (July)
    ; %c - Date and time representation (MM/DD/YY hh:mm:ss)
    ; %d - Day of the month (01-31)
    ; %H - Hour in 24hr format (00-23)
    ; %I - Hour in 12hr format (01-12)
    ; %j - Day of the year (001-366)
    ; %m - Month number (01-12)
    ; %M - Minute (00-59)
    ; %p - Ante meridiem or Post Meridiem (AM / PM)
    ; %S - Second (00-59)
    ; %U - Week of the year, with Sunday as the first day of the week (00 - 53)
    ; %w - Day of the week as a number (0-6; Sunday = 0)
    ; %W - Week of the year, with Monday as the first day of the week (00 - 53)
    ; %x - Date representation (MM/DD/YY)
    ; %X - Time representation (hh:mm:ss)
    ; %y - 2 digit year (99)
    ; %Y - 4 digit year (1999)
    ; %z, %Z - Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
    ; %% - Literal percent character
    ; The # character can be used as a flag to specify extra settings:
    ; %#c - Long date and time representation appropriate for current locale. (ex: "Tuesday, March 14, 1995, 12:41:29")
    ; %#x - Long date representation, appropriate to current locale. (ex: "Tuesday, March 14, 1995")
    ; %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y - Remove leading zeros (if any).
    ;
    ; User CallTip: _StringFormatTime($s_Format, $i_Timestamp = -1, $i_MaxLen = 255) - Get a string representation of a timestamp according to the format string given to the function. (required: <_UnixTime.au3>)
    ; Author(s): Rob Saunders ([email='admin@therks.com'][/email])
    ;
    ;===============================================================================
    Func _StringFormatTime($s_Format, $i_Timestamp = -1, $i_MaxLen = 255)
    Local $struct_Time, $ptr_Time, $av_Time, $av_StrfTime

    [/autoit] [autoit][/autoit] [autoit]

    If $i_Timestamp = default OR $i_Timestamp < 0 Then
    $i_Timestamp = _TimeGetStamp()
    EndIf
    $ptr_Time = DllCall('CrtDll.dll', 'ptr:cdecl', 'localtime', 'long*', $i_Timestamp)
    If @error Then
    SetError(99)
    Return False
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $av_StrfTime = DllCall('CrtDll.dll', 'int:cdecl', 'strftime', _
    'str', '', _
    'int', $i_MaxLen, _
    'str', $s_Format, _
    'ptr', $ptr_Time[0])
    Return $av_StrfTime[1]
    EndFunc

    [/autoit]
  • Cool, damit komme ich weiter. Wie sieht es aber mit der Zeitzone aus?
    Die wird ja in RFC822 so angegeben: +0200
    Bei mir liefert %z / %Z aber nichts:

    MsgBox("","",_StringFormatTime("%a, %d %b %Y %H:%M:%S (%z / %Z)","1372277926"))

  • Das Problem ist ein ganz anderes. Der Unix-Timestamp ist mit GMT erzeugt worden, wird zur Anzeige aber mit GMT+1 gebracht, damit braucht das RFC822 Datum noch die Zoneninformation:

    Code
    Func _DateToRFC822_TimeZone()
    	Local $tLocalTime = _Date_Time_GetLocalTime(), $aLocalTime = _Date_Time_SystemTimeToArray($tLocalTime)
    	Local $tSystemTime = _Date_Time_GetSystemTime(), $aSystemTime = _Date_Time_SystemTimeToArray($tSystemTime)
    	Local $sRFC822_TimeZone = StringFormat('%+03d00',$aLocalTime[3] - $aSystemTime[3])
    	$tLocalTime = ''
    	$tSystemTime = ''
    	Return $sRFC822_TimeZone
    EndFunc

    Sollte so passen... Einwände?

    Einmal editiert, zuletzt von r0m (30. Juli 2013 um 15:03)