Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jean-Phil/e35790bf635887d9cb42 to your computer and use it in GitHub Desktop.
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 )
/*
* 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 )
)
/* --- 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