2016-10-24 20 views
5

Tôi cố gắng để chuyển đổi thời gian hex (nhận được đầu ra đầu tiên từ mô-đun hạt nhân) vào granularity nano giây,Làm thế nào để có được granularity thứ hai nano từ thời gian hex?

580a9272.0a9ce167 

và tôi đang cố gắng để chuyển đổi nó sử dụng perl sang định dạng có thể đọc được con người:

while (<>) { 
s/^([a-fA-F0-9]+)(\.)([a-fA-F0-9]+)(\s+.*)/sprintf("%s%s%s%s",&$converter(hex($1)), $2, hex($3), $4)/oe; 
} continue { 
print; 
} 

đầu ra : Thứ Sáu Tháng Mười 21 18:10:58 2016.178053479

Bộ chuyển đổi sử dụng localtime() và gmtime() trực tiếp Tôi muốn có thời gian với độ chi tiết nano và sau đó năm.Bất kỳ trợ giúp nào được đánh giá cao.

+1

Điều này có hữu ích không? [http://stackoverflow.com/questions/36731370/convert-64-bit-hex-to-nanoseconds-timestamps](http://stackoverflow.com/questions/36731370/convert-64-bit-hex-to- nano giây-timestamps) –

+0

liên kết nói về việc làm nó trong c + +, tôi đang sử dụng perl để chuyển đổi, tôi rất gần nhưng thiếu trên bit cuối cùng. – MikasaAckerman

Trả lời

3

POSIX::strftime không hỗ trợ số giây phân đoạn, vì vậy bạn cần phải tạo đầu ra theo các phần.

use POSIX qw(strftime); 

my $opt_gmt = 1; 
my $hex = '580a9272.0a9ce167'; 

my ($s, $ns) = map hex($_), split /\./, $hex; 
my $formatted_ns = sprintf("%09d", $ns); 
my $formatted = strftime("%a %b %d %H:%M:%S.$formatted_ns %Y", 
    defined($opt_gmt) ? gmtime($s) : localtime($s)); 

say $formatted; # Fri Oct 21 22:10:58.178053479 2016 

DateTime có hỗ trợ gốc cho nano giây, để trình bày giải pháp thay thế.

use DateTime qw(); 

my $opt_gmt = 1; 
my $hex = '580a9272.0a9ce167'; 

my ($s, $ns) = map hex($_), split /\./, $hex; 
my $dt = DateTime->from_epoch(epoch => $s); 
$dt->set_nanosecond($ns); 
$dt->set_time_zone(defined($opt_gmt) ? 'UTC' : 'local'); 

say $dt->strftime("%a %b %d %H:%M:%S.%N %Y"); # Fri Oct 21 22:10:58.178053479 2016 
+0

Tôi đang sử dụng: nếu (được xác định ($ opt_gmt)) { # GMT luôn thắng. $ converter = \ & my_gmtime; } elsif (được xác định ($ opt_local)) { # giờ địa phương được yêu cầu. $ converter = \ & my_localtime; } else { # Mặc định là giờ địa phương. $ converter = \ & my_localtime; } – MikasaAckerman

+0

Điều chỉnh cho phù hợp. Thật kỳ lạ khi '$ opt_gmt = 0;' khiến UTC được sử dụng. – ikegami

+0

chỉ cần theo dõi, nó có thể được thực hiện mà không cần sử dụng bất kỳ mô-đun nào khác không? nhưng cốt lõi ?? – MikasaAckerman

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