Hi,
The issue is very simple; DateTime.strptime('%s %z') doesn't work correctly:
···
---
require 'date'
date = DateTime.strptime('1377283786 -0700', '%s %z')
puts date.strftime('%s %z')
---
1377283786 +0000
Fortunately there's a patch available:
https://bugs.ruby-lang.org/attachments/3307/bug-7445.patch
After applying this patch, Ruby returns the right date ('1377283786 -0700').
Applying this patch wouldn't affect anybody negatively, because the people that
use '%s' and assume it's UTC, can continue to do so. So why not apply it?
This format is used exensively by Git. If you look at a git commit object (git
cat-file -p), you find this:
author Junio C Hamano <gitster@pobox.com> 1377283786 -0700
Which correspondes exactly to '%s %z'.
Other languages also work correctly:
C:
---
#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]) {
struct tm tm;
char buf[0x100];
strptime("1377283786 -0700", "%s %z", &tm);
strftime(buf, sizeof(buf), "%s %z", &tm);
printf("%s\n", buf);
return 0;
}
---
1377283786 -0700
Perl:
---
use DateTime::Format::Strptime;
my $format = DateTime::Format::Strptime->new(
pattern => '%s %z',
);
my $dt = $format->parse_datetime('1377283786 -0700');
print $format->format_datetime($dt), "\n";
---
1377283786 -0700
Python doesn't allow the '%s' format at all, but at least they warn the user
about that, Ruby just fails silently with '%s %z'.
Unfortunately the discussion in bug #7445 didn't lead anywhere.
I'm hoping you can take a look at this with fresh eyes and realize it's in the
best interest of everyone to apply this patch.
Can we just apply it?
Cheers.
--
Felipe Contreras