2010-10-11 43 views

Trả lời

11

Bạn có thể chia thời gian vào giờ và phút và sau đó sử dụng ceil chức năng như:

use POSIX; 

my ($hr,$min) = split/:/,$time;  
my $rounded_min = ceil($min/15) * 15; 

if($rounded_min == 60) { 
    $rounded_min = 0; 
    $hr++; 
    $hr = 0 if($hr == 24); 
} 
+0

gọn gàng, nhưng sẽ trở nên 12:58 12:60 và không 13:00 :-( –

+0

@ Øyvind Skaar: Cảm ơn vì đã chỉ cố định nó bây giờ – codaddict

8

Khoảng 15 phút gần 6:07 là 6:00, không 06:15. Bạn có muốn khoảng thời gian 15 phút gần nhất hoặc khoảng thời gian 15 phút tiếp theo không?

Giả sử nó gần nhất, một cái gì đó như thế này làm những gì bạn muốn.

#!/usr/bin/perl 

use strict; 
use warnings; 

use constant FIFTEEN => (15 * 60); 

my $now = time; 

if (my $diff = $now % FIFTEEN) { 
    if ($diff < FIFTEEN/2) { 
    $now -= $diff; 
    } else { 
    $now += (15*60) - $diff; 
    } 
} 

print scalar localtime $now, "\n"; 
+8

'FIFTEEN' là một cái tên thực sự tồi tệ cho một hằng số.. bằng 900. :) – friedo

+0

Hằng số không được sử dụng trong dòng '$ now + = (15 * 60) - $ diff;' – MikeKulls

4

Một giải pháp dễ dàng là sử dụng Math::Round từ CPAN.

use strict; 
use warnings; 
use 5.010; 

use Math::Round qw(nearest); 

my $current_quarter = nearest(15*60, time()); 
say scalar localtime($current_quarter); 
0

Biến thể nhỏ trên câu trả lời đầu tiên sử dụng sprintf thay vì ceil và POSIX. Cũng không sử dụng bất kỳ mô-đun CPAN bổ sung nào. Điều này làm tròn lên hoặc xuống để 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 và 6:23 = 6:30. Lưu ý rằng một giờ được thêm vào nếu các phút được làm tròn bằng 60. Tuy nhiên để làm điều này đúng cách, bạn sẽ phải sử dụng một hàm thời gian và địa phương để thêm giờ. tức là thêm một giờ có thể thêm một ngày, tháng hoặc năm.

#!/usr/bin/perl 

    my ($hr,$min) = split/:/,$time; 

    my $interimval = ($min/15); 

    my $rounded_min = sprintf "%.0f", $interimval; 

    $rounded_min = $rounded_min * 15; 

    if($rounded_min == 60) 

    { 

    $rounded_min = 0; 

    $hr++; 

    $hr = 0 if($hr == 24); 

    } 
Các vấn đề liên quan