[rt.cpan.org #79845] [PATCH] sub-second precision and rounding

[email protected] ("Martin Becker via RT")
Newsgroups perl.datetime
Message-ID <[email protected]>
<URL: https://rt.cpan.org/Ticket/Display.html?id=79845 >

And here is the patch.

-Martin
DateTime-0.76-MHASCH-01.patch (text/x-patch, 3.8 KB)
diff -rup DateTime-0.76.orig/Build.PL DateTime-0.76/Build.PL
--- DateTime-0.76.orig/Build.PL	2012-07-01 23:55:52.000000000 +0200
+++ DateTime-0.76/Build.PL	2012-09-25 12:34:19.000000000 +0200
@@ -31,7 +31,6 @@ my %module_build_args = (
     "Carp" => 0,
     "DateTime::Locale" => "0.41",
     "DateTime::TimeZone" => "1.09",
-    "Math::Round" => 0,
     "Params::Validate" => "0.76",
     "Scalar::Util" => 0,
     "XSLoader" => 0,
diff -rup DateTime-0.76.orig/lib/DateTime.pm DateTime-0.76/lib/DateTime.pm
--- DateTime-0.76.orig/lib/DateTime.pm	2012-07-01 23:55:52.000000000 +0200
+++ DateTime-0.76/lib/DateTime.pm	2012-09-25 12:30:47.000000000 +0200
@@ -44,7 +44,7 @@ use DateTime::Duration;
 use DateTime::Helpers;
 use DateTime::Locale 0.41;
 use DateTime::TimeZone 1.09;
-use Math::Round qw( nearest round );
+use POSIX qw(floor);
 use Params::Validate 0.76
     qw( validate validate_pos UNDEF SCALAR BOOLEAN HASHREF OBJECT );
 
@@ -824,9 +824,9 @@ sub nanosecond {
     return $_[0]->{rd_nanosecs};
 }
 
-sub millisecond { round( $_[0]->{rd_nanosecs} / 1000000 ) }
+sub millisecond { floor( $_[0]->{rd_nanosecs} / 1000000 ) }
 
-sub microsecond { round( $_[0]->{rd_nanosecs} / 1000 ) }
+sub microsecond { floor( $_[0]->{rd_nanosecs} / 1000 ) }
 
 sub leap_seconds {
     my $self = shift;
@@ -1304,7 +1304,7 @@ sub _format_nanosecs {
 
     return sprintf(
         '%0' . $precision . 'u',
-        round( $self->{rd_nanosecs} / $divide_by )
+        floor( $self->{rd_nanosecs} / $divide_by )
     );
 }
 
@@ -2647,10 +2647,9 @@ Half a second is 500 milliseconds.
 =item * $dt->microsecond()
 
 Returns the fractional part of the second as microseconds (1E-6
-seconds). This value will be rounded to an integer.
+seconds).
 
-Half a second is 500_000 microseconds. This value will be rounded to
-an integer.
+Half a second is 500_000 microseconds.
 
 =item * $dt->nanosecond()
 
diff -rup DateTime-0.76.orig/t/03components.t DateTime-0.76/t/03components.t
--- DateTime-0.76.orig/t/03components.t	2012-07-01 23:55:52.000000000 +0200
+++ DateTime-0.76/t/03components.t	2012-09-25 09:36:49.000000000 +0200
@@ -260,14 +260,14 @@ is( $monday->day_of_week, 1, "Monday is
     $dt->set( nanosecond => 500_000_500 );
 
     is( $dt->nanosecond,  500_000_500, 'nanosecond is 500,000,500' );
-    is( $dt->microsecond, 500_001,     'microsecond is 500,001' );
+    is( $dt->microsecond, 500_000,     'microsecond is 500,001' );
     is( $dt->millisecond, 500,         'millisecond is 500' );
 
     $dt->set( nanosecond => 499_999_999 );
 
     is( $dt->nanosecond,  499_999_999, 'nanosecond is 499,999,999' );
-    is( $dt->microsecond, 500_000,     'microsecond is 500,000' );
-    is( $dt->millisecond, 500,         'millisecond is 500' );
+    is( $dt->microsecond, 499_999,     'microsecond is 499,999' );
+    is( $dt->millisecond, 499,         'millisecond is 499' );
 
     $dt->set( nanosecond => 450_000_001 );
 
@@ -279,7 +279,7 @@ is( $monday->day_of_week, 1, "Monday is
 
     is( $dt->nanosecond,  450_500_000, 'nanosecond is 450,500,000' );
     is( $dt->microsecond, 450_500,     'microsecond is 450,500' );
-    is( $dt->millisecond, 451,         'millisecond is 451' );
+    is( $dt->millisecond, 450,         'millisecond is 450' );
 }
 
 {
diff -rup DateTime-0.76.orig/t/13strftime.t DateTime-0.76/t/13strftime.t
--- DateTime-0.76.orig/t/13strftime.t	2012-07-01 23:55:52.000000000 +0200
+++ DateTime-0.76/t/13strftime.t	2012-09-25 09:41:22.000000000 +0200
@@ -209,7 +209,7 @@ year => 1999, month => 9, day => 7, hour
 %M => '02'
 %N => '123456789'
 %3N => '123'
-%6N => '123457'
+%6N => '123456'
 %10N => '1234567890'
 %p => 'PM'
 %r => '01:02:42 PM'
@@ -314,5 +314,5 @@ year => 2012, month => 1, day => 10
 year => 1999, month => 9, day => 7, hour => 13, minute => 2, second => 42, nanosecond => 00012345678
 %N => '012345678'
 %3N => '012'
-%6N => '012346'
+%6N => '012345'
 %10N => '0123456780'
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.