Last active
April 7, 2023 01:50
-
-
Save jean-Phil/e35790bf635887d9cb42 to your computer and use it in GitHub Desktop.
convert filemaker TIMESTAMPS to/from internet standards ( ISO 8601, UnixTimeStamp, or iCalendar format )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* INPUT formats supported: UNIX timestamp, iCalendar/ RFC 2445, ISO_8601 | |
* | |
* user must choose OUTPUT type : 1) timestamp; 2) date, 3) time, 4) utcOffset/offset, 5) list( date time offset ) = default | |
*/ | |
Let([ | |
_list = Case( | |
PatternCount( Lower( format ); "unix"); | |
Let([ | |
POSIXorigin = 62135596800 ; /* 1970/01/01 UTC +00:00 */ | |
_timeStamp = GetAsTimestamp( _input + POSIXorigin ) ; | |
_date = GetAsDate( _timeStamp ) ; | |
_time = GetAsTime( _timeStamp ) ; | |
_offset = GetAsTime( "00:00" ) | |
]; | |
_date &¶& | |
_time &¶& | |
_offset | |
); | |
PatternCount( format ; "8601" ); | |
Let([ | |
_date = GetValue( Substitute ( _input ; [ "T" ; "¶"] ) ; 1 ); | |
_timeAndOffset = GetValue( Substitute ( _input ; [ "T" ; "¶"] ) ; 2 ); | |
_date = Substitute( _date ; "-" ; "¶" ); | |
_yr = GetAsNumber( GetValue( _date ; 1 ) ); | |
_mo = GetAsNumber( GetValue( _date ; 2 ) ); | |
_d = GetAsNumber( GetValue( _date ; 3 ) ); | |
_date = Date( _mo ; _d ; _yr ); | |
_timeAndOffset = Substitute( _timeAndOffset ; [ "+" ; "¶" ]; [ "-" ; "¶" ] ); | |
_time = GetAsTime( GetValue ( _timeAndOffset ; 1 ) ); | |
_offset = GetAsTime( GetValue ( _timeAndOffset ; 2 ) ); | |
_offset = If( PatternCount( _input ; "+" ); _offset; - _offset ) | |
]; | |
_date &¶& | |
_time &¶& | |
_offset | |
); | |
PatternCount( Lower( format ) ; "ical" ) or PatternCount( format ; 2445 ); | |
Let([ | |
_date = GetValue( Substitute ( _input ; [ "T" ; "¶"] ) ; 1 ); | |
_time = GetValue( Substitute ( _input ; [ "T" ; "¶"] ; [ "Z" ; "" ] ) ; 2 ); | |
_yr = GetAsNumber( Middle( _input ; 1 ; 4 ) ); | |
_mo = GetAsNumber( Middle( _input ; 5 ; 6 ) ); | |
_d = GetAsNumber( Middle( _input ; 7 ; 8 ) ); | |
_date = Date( _mo ; _d ; _yr ); | |
_hr = GetAsNumber( Middle( _time ; 1 ; 2 ) ); | |
_min = GetAsNumber( Middle( _time ; 3 ; 4 ) ); | |
_sec = GetAsNumber( Middle( _time ; 5 ; 6 ) ); | |
_date = Time ( _hr ; _min ; _sec ) | |
]; | |
_date &¶& | |
_time &¶& | |
"UTC Offset is not implemented yet for iCalendar format" | |
) | |
); | |
_date = GetValue( _list ; 1 ); | |
_time = GetValue( _list ; 2 ); | |
_offset = GetValue ( _list ; 3 ); | |
_timeStamp = Timestamp( _date ; _time ) | |
]; | |
Case( | |
Lower ( outputRequest ) = "timestamp"; | |
_timeStamp; | |
Lower ( outputRequest ) = "date"; | |
_date; | |
Lower ( outputRequest ) = "time"; | |
_time; | |
PatternCount( Lower ( outputRequest ) ; "offset" ); | |
_offset; | |
_list ) | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* --- UNIX timestamp --- */ | |
/* --- iCalendar RFC 2445 --- */ | |
/* --- ISO_8601 --- */ | |
Case( | |
PatternCount( Lower( format ); "unix"); | |
Let([ | |
TSasNumber = GetAsNumber( GetAsTimestamp( _timeStamp ) ); | |
utcOffset = | |
Let([ | |
~utcOffset = If( GetAsTime( utcOffset ) > GetAsTime( "-12:00" ) and GetAsTime( utcOffset ) <= GetAsTime( "24:00" ); GetAsTime( utcOffset ); | |
Time( utcOffset ; 0 ; 0) | |
); | |
ref = GetAsTime("12:00") | |
]; | |
If( ~utcOffset > ref ; ~utcOffset - GetAsTime( "24:00" ) ; ~utcOffset ) | |
); | |
offsetAsNumber = GetAsNumber( utcOffset ); | |
POSIXorigin = 62135596800 /* 1970/01/01 UTC +00:00 */ | |
]; | |
TSasNumber - POSIXorigin + offsetAsNumber | |
); | |
PatternCount( format ; "8601" ); | |
Let([ | |
d = GetAsDate( GetAsTimestamp( _timeStamp ) ); | |
t = GetAsTime( GetAsTimestamp( _timeStamp ) ); | |
utcOffset = | |
Let([ | |
~utcOffset = GetAsTime( utcOffset ); | |
ref = GetAsTime("12:00"); | |
~utcOffset = If( ~utcOffset > ref ; GetAsTime( "24:00" ) - ~utcOffset ; ~utcOffset ) | |
]; | |
If( ~utcOffset >= 0 ; "+"; "-" ) & Right ( "00" & Abs(Hour( ~utcOffset )) ; 2 ) & ":" & Right ( "00" & Minute( ~utcOffset ) ; 2 ) | |
) | |
]; | |
Right( "20" & Year(d) ; 4 ) & "-" & Right( "00" & Month(d) ; 2 ) & "-" & Right( "00" & Day(d) ; 2 ) | |
& "T" & | |
Right( "00" & Hour(t) ; 2 ) & ":" & Right( "00" & Minute(t) ; 2 ) & ":" & Right( "00" & Seconds(t) ; 2 ) | |
& utcOffset | |
); | |
PatternCount( Lower( format ) ; "ical" ) or PatternCount( format ; 2445 ); | |
Let([ | |
d = GetAsDate( _timeStamp ); | |
t = GetAsTime( _timeStamp ) | |
]; | |
Year( d) & Right( "00" & Month( d ) ; 2 ) & Right( "00" & Day( d ) ; 2 ) & | |
"T" & | |
Right( "00" & Hour( t ) ; 2 ) & Right( "00" & Minute( t ) ; 2 ) & Right( "00" & Seconds( t ) ; 2 ) & | |
"Z" | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment