Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2 from mbeijen/ntp
Added NTP epoch formatter.
- Loading branch information
Showing
5 changed files
with
139 additions
and
0 deletions.
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#!/usr/bin/env perl | ||
|
||
use strict; | ||
use warnings; | ||
use v5.10; | ||
|
||
use DateTime::Format::Epoch::NTP; | ||
use Socket; | ||
|
||
my $hostname = 'pool.ntp.org'; | ||
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('udp')); | ||
my $ipaddr = inet_aton($hostname); | ||
my $portaddr = sockaddr_in(123, $ipaddr); | ||
my $bstr = "\010" . "\0"x47; | ||
send(SOCKET, $bstr, 0, $portaddr); | ||
$portaddr = recv(SOCKET, $bstr, 1024, 0); | ||
my @words = unpack("N12",$bstr); | ||
my $ntptime = $words[10]; | ||
|
||
my $dt = DateTime::Format::Epoch::NTP->parse_datetime( $ntptime ); | ||
|
||
$dt->set_time_zone('Europe/Moscow'); | ||
|
||
say "NTPTime $ntptime is in Moscow: " . $dt->hms; | ||
say $dt->datetime; |
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package DateTime::Format::Epoch::NTP; | ||
|
||
use strict; | ||
use warnings; | ||
|
||
use vars qw($VERSION @ISA); | ||
|
||
$VERSION = '0.14'; | ||
|
||
use DateTime; | ||
use DateTime::Format::Epoch; | ||
|
||
@ISA = qw/DateTime::Format::Epoch/; | ||
|
||
my $epoch = DateTime->new( year => 1900, month => 1, day => 1, | ||
time_zone => 'UTC' ); | ||
|
||
sub new { | ||
my $class = shift; | ||
|
||
return $class->SUPER::new( epoch => $epoch, | ||
unit => 'seconds', | ||
type => 'int', | ||
skip_leap_seconds => 1 ); | ||
} | ||
|
||
1; | ||
__END__ | ||
=head1 NAME | ||
DateTime::Format::Epoch::NTP - Convert DateTimes to/from NTP epoch seconds | ||
=head1 SYNOPSIS | ||
use DateTime::Format::Epoch::NTP; | ||
my $dt = DateTime::Format::Epoch::NTP->parse_datetime( 3629861151 ); | ||
print $dt->datetime; # '2015-01-10T06:45:51' | ||
my $formatter = DateTime::Format::Epoch::NTP->new(); | ||
my $dt = DateTime->new( year => 2015, month => 1, day => 10, | ||
time_zone => 'Europe/Amsterdam' ); | ||
print $formatter->format_datetime($dt); # '3629833200' | ||
=head1 DESCRIPTION | ||
This module can convert a DateTime object (or any object that can be | ||
converted to a DateTime object) to the number of seconds since the NTP | ||
epoch. | ||
The NTP epoch uses UTC; if you parse an NTP date your DateTime object | ||
will be using the UTC timezone. | ||
=head1 METHODS | ||
Most of the methods are the same as those in L<DateTime::Format::Epoch>. | ||
The only difference is the constructor. | ||
=over 4 | ||
=item * new() | ||
Constructor of the formatter/parser object. It has no parameters. | ||
=back | ||
=head1 SUPPORT | ||
Support for this module is provided via the datetime@perl.org email | ||
list. See http://lists.perl.org/ for more details. | ||
=head1 AUTHOR | ||
Eugene van der Pijll <pijll@gmx.net> | ||
=head1 COPYRIGHT | ||
Copyright (c) 2015 Michiel Beijen. This program is free software; you can | ||
redistribute it and/or modify it under the same terms as Perl itself. | ||
=head1 SEE ALSO | ||
L<DateTime> | ||
datetime@perl.org mailing list | ||
=cut |
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# t/001_load.t - check module loading | ||
|
||
use Test::More tests => 1; | ||
|
||
BEGIN { use_ok( 'DateTime::Format::Epoch::NTP' ); } |
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
use strict; | ||
BEGIN { $^W = 1 } | ||
|
||
use Test::More tests => 4; | ||
use DateTime; | ||
use DateTime::Format::Epoch::NTP; | ||
|
||
my $f = DateTime::Format::Epoch::NTP->new(); | ||
|
||
isa_ok($f, 'DateTime::Format::Epoch::NTP' ); | ||
|
||
my $dt = DateTime->new( year => 2015, month => 1, day => 10, | ||
time_zone => 'Europe/Amsterdam' ); | ||
is($f->format_datetime($dt), '3629833200', 'Format DateTime as NTP epoch time'); | ||
|
||
$dt = DateTime::Format::Epoch::NTP->parse_datetime( 3629848426 ); | ||
|
||
is($dt->iso8601(), '2015-01-10T03:13:46', 'read NTP time'); | ||
is($dt->time_zone_long_name(), 'UTC', 'NPT time timezone is UTC'); |