in reply to converting microsoft timestamps

Assuming from your description that you are talking about FILETIME structs, you could do it like this.

#! perl -slw use strict; use Win32API::File qw[ FdGetOsFHandle ]; use Win32::API::Prototype; ApiLink( 'kernel32', 'BOOL FileTimeToSystemTime( LPFILETIME lpFileTime, LPSYSTEMTIME lpSystemTime )' ) or die $^E; ApiLink( 'kernel32', 'BOOL GetFileTime( HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime )' ) or die $^E; ## Get an OSfilehandle for the curent script my $osfh = FdGetOsFHandle( fileno( DATA ) ) or die $!; ## 3 x quadword buffers for the FILETIME structs my( $ctime, $atime, $wtime ) = ( chr(0) x 8 ) x 3; ## Get them GetFileTime( $osfh, $ctime, $atime, $wtime ) or die $^E; ## 8 word buffer for the SYSTEMTIME struct my $systime = chr( 0 ) x 16; for( $ctime, $atime, $wtime ) { ##Convert the FILETIMEs to SYTEMTIMEs FileTimeToSystemTime( $_, $systime ) or die $^E; printf "Year: %4d Month: %2d DOW: %1d Day: %2d Hour: %2d Minutes: +%2d Seconds: %2d Milliseconds: %3d\n", unpack 'v8', $systime; } __DATA__ P:\test>368002 Year: 2004 Month: 6 DOW: 5 Day: 18 Hour: 17 Minutes: 47 Seconds: 5 M +illiseconds: 283 Year: 2004 Month: 6 DOW: 5 Day: 18 Hour: 18 Minutes: 7 Seconds: 38 M +illiseconds: 689 Year: 2004 Month: 6 DOW: 5 Day: 18 Hour: 18 Minutes: 7 Seconds: 37 M +illiseconds: 1

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
"Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon

Replies are listed 'Best First'.
Re^2: converting microsoft timestamps
by glwtta (Hermit) on Jun 18, 2004 at 18:19 UTC
    That seems reasonable, except I am on UNIX, Win32 APIs really don't help much. Any pure perl solutions?

    Thanks

      In that case you want something like this

      #! perl -slw use strict; use Win32API::File qw[ FdGetOsFHandle ]; use Win32::API::Prototype; ApiLink( 'kernel32', 'BOOL GetFileTime( HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime )' ) or die $^E; my $osfh = FdGetOsFHandle( fileno( DATA ) ) or die $!; my( $ctime, $atime, $wtime ) = ( chr(0) x 8 ) x 3; GetFileTime( $osfh, $ctime, $atime, $wtime ) or die $^E; ## Ignore the stuf above, ## it's just a way of getting some FILETIMEs for testing. sub msFiletimeToUnix{ my ( $lo, $hi ) = unpack 'V2', $_[ 0 ]; my $nanosecs = $hi * 2**32 + $lo; return int( ($nanosecs - 116444736010000000) / 1E7 ); } for( $ctime, $atime, $wtime ) { print scalar localtime( msFiletimeToUnix( $_ ) ); } __DATA__ P:\test>368002 Fri Jun 18 18:47:04 2004 Fri Jun 18 20:10:35 2004 Fri Jun 18 20:10:33 2004

      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "Think for yourself!" - Abigail
      "Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon