2016-10-24 37 views
5

Ben nanosaniye tanesellik içine altıgen süresini (çekirdek modülünden ilk çıkışını almak) dönüştürmek için çalışıyorum,Nano ikinci boyuttan onaltılık zamandan nasıl edinilir?

580a9272.0a9ce167 

ve insan okunabilir biçime Perl kullanarak dönüştürmek çalışıyorum:

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; 
} 

çıktı : Cum Ekim 21 18:10:58 2016.178053479

Dönüştürücü, localtime() ve gmtime() öğelerini doğrudan kullanmaktadır. Nano ayrıntı düzeyine sahip olmak istiyorum ve sonra da yıl.Yakın yardımlar çok takdir ediliyor.

+1

Bu yardımcı olur mu? [http://stackoverflow.com/questions/36731370/convert-64-bit-hex-to-nanoseconds-timestamps](http://stackoverflow.com/questions/36731370/convert-64-bit-hex-to- nanoseconds-timestamps) –

+0

link C++ 'da bunu yapmanın nasıl olduğunu anlatıyor, dönüştürmek için perl kullanıyorum, çok yakınım ama sonda eksik. – MikasaAckerman

cevap

3

POSIX::strftime kesirli saniyeleri desteklemez, bu nedenle çıktıyı parçalar halinde oluşturmanız gerekir.

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 nanosaniye için yerel desteğe sahiptir, böylece bir alternatif sunar.

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

Kullanıyorum: if (tanımlı ($ opt_gmt)) { # GMT her zaman kazanır. $ çevirici = \ & my_gmtime; } elsif (tanımlı ($ opt_local)) { # localtime talep edildi. $ çevirici = \ & my_localtime; } else { # Varsayılan yerel değerdir. $ çevirici = \ & my_localtime; } – MikasaAckerman

+0

Buna göre ayarlandı. Yine de, $ opt_gmt = 0; 'UTC'nin kullanılmasına neden olan gerçekten garip. – ikegami

+0

sadece bir takip, başka bir modül kullanmadan yapılabilir mi? ama çekirdek ?? – MikasaAckerman