diff options
author | Dave Arter <davea@mysociety.org> | 2016-04-01 17:24:17 +0100 |
---|---|---|
committer | Dave Arter <davea@mysociety.org> | 2017-02-15 17:50:03 +0000 |
commit | 39efe2bbd050b6eea6df4dd092739b4883840410 (patch) | |
tree | 9ed41c92ec5b05224acd463f4d3d13cfd3d17bf9 | |
parent | 957f2d968c17a34a6fa95bea6cb6a4eace229aa6 (diff) |
[Oxfordshire] Open311 update timestamps should be in UTC
The timestamps returned from the database are in server-local time, not UTC.
Because FMS expects timestamps in Open311 responses to be UTC, the timestamps
of updates from OCC appear one hour ahead when DST is in effect.
This commit converts the timestamps to UTC before outputting them.
Fixes mysociety/FixMyStreet-Commercial#499
-rwxr-xr-x | bin/oxfordshire/open311_service_request_update.cgi | 2 | ||||
-rw-r--r-- | bin/oxfordshire/open311_services.pm | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/bin/oxfordshire/open311_service_request_update.cgi b/bin/oxfordshire/open311_service_request_update.cgi index 87b14fb98..8fb190e0e 100755 --- a/bin/oxfordshire/open311_service_request_update.cgi +++ b/bin/oxfordshire/open311_service_request_update.cgi @@ -102,7 +102,7 @@ XML foreach my $row(@{$ary_ref}) { if (defined $row) { my ($id, $service_req_id, $updated_at, $status, $desc) = map { prepare_for_xml($_) } @$row; - $updated_at=~s/(\d{4}-\d\d-\d\d) (\d\d:\d\d:\d\d)/${1}T${2}Z/; # for now assume OCC in Zulu time + $updated_at = get_utc_iso8601_string($updated_at); # value from the DB is in server-local time, convert to UTC. $xml.= <<XML; <request_update> <update_id>$id</update_id> diff --git a/bin/oxfordshire/open311_services.pm b/bin/oxfordshire/open311_services.pm index 12d0754fa..9be598751 100644 --- a/bin/oxfordshire/open311_services.pm +++ b/bin/oxfordshire/open311_services.pm @@ -10,6 +10,8 @@ use CGI; use Encode qw(from_to); use DBI; use Time::Piece; +use Time::Local qw(timelocal); +use POSIX qw(strftime); ################################################################### @@ -145,6 +147,20 @@ sub get_date_or_nothing { return $d; } +#------------------------------------------------------------------ +# get_utc_iso8601_string +# Takes a local date/time string and converts it to UTC, returning +# a ISO8601-format string. +# expected format: YYYY-MM-DD HH:MM:SS +# e.g.: 2016-04-01 13:37:42 -> 2016-04-01T12:37:42Z +#------------------------------------------------------------------ +sub get_utc_iso8601_string { + my $datetime = shift; + $datetime =~ s{(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)}{ + strftime "%Y-%m-%dT%H:%M:%SZ", gmtime(timelocal($6, $5, $4, $3, int($2)-1, int($1)-1900)); + }e; + return $datetime; +} 1; |