Link to home
Start Free TrialLog in
Avatar of Steve Groner
Steve Groner

asked on

Convert Unix Timestamp into local date and time

I need to convert the following using visual basic:

UNIX Timestamp: 999719410.163

Result: Wed Sep  5 12:50:10 2001

Can someone please send me a function to do this.

Thanks in advance.

Avatar of Anthony Perkins
Anthony Perkins
Flag of United States of America image

Function ConvUNIXTimeStamp(ByVal UNIXTimeStamp As Currency) As Date
Const UNIXDate = #1/1/70#

ConvUNIXTimeStamp = DateAdd("s", UNIXTimeStamp, UNIXDate)

End Function

? ConvUNIXTimeStamp(999719410.163)
9/5/01 7:50:10 PM

I suspect the differences have to to with TimeZones as in UTC.

Anthony
Avatar of Steve Groner
Steve Groner

ASKER

Close, but how do you allow for the current time zone change from where I am compared to UTC, I am in Southern California (PDT)
This would depend on DST. Currently it is -7.

Anthony
ASKER CERTIFIED SOLUTION
Avatar of Anthony Perkins
Anthony Perkins
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thank you very much, I had already insert that, but was wondering if there was a way to automatically grab the timezone from the machine I am using.
To get the current locale's bias based on GMT and the computer's settings, try this:

First, add this information to a module:

Private Const TIME_ZONE_ID_UNKNOWN As Long = 1
Private Const TIME_ZONE_ID_STANDARD As Long = 1
Private Const TIME_ZONE_ID_DAYLIGHT As Long = 2
Private Const TIME_ZONE_ID_INVALID As Long = &HFFFFFFFF

Private Type SYSTEMTIME
   wYear         As Integer
   wMonth        As Integer
   wDayOfWeek    As Integer
   wDay          As Integer
   wHour         As Integer
   wMinute       As Integer
   wSecond       As Integer
   wMilliseconds As Integer
End Type

Private Type TIME_ZONE_INFORMATION
   Bias As Long
   StandardName(0 To ((32 * 2) - 1)) As Byte  'unicode
   StandardDate As SYSTEMTIME
   StandardBias As Long
   DaylightName(0 To ((32 * 2) - 1)) As Byte  'unicode
   DaylightDate As SYSTEMTIME
   DaylightBias As Long
End Type

Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long


Then, add this function:

Private Function ConvertUnixTimestampToGMT(ByVal UnixTimeStamp As Currency) As Date

   Const UnixBaseDate = #01/01/1970#

   Dim tzi As TIME_ZONE_INFORMATION
   Dim dwBias As Long

   Select Case GetTimeZoneInformation(tzi)
   Case TIME_ZONE_ID_DAYLIGHT:
              dwBias = tzi.Bias + tzi.DaylightBias
   Case Else: dwBias = tzi.Bias + tzi.StandardBias
   End Select

   GetCurrentTimeBias = DateAdd("n", -dwBias, DateAdd("s",UnixTimeStamp, UnixBaseDate))
   
End Function


The following function will give you the difference in time from the workstation you are using (providing it is set correctly in the Control Panel!).  By the way, my use of the Currency data type has to do with the fact that some timezones are in fractions. i.e +8.5.  If this is never going to be your case than change to integer.

Type TIME_ZONE_INFORMATION
   Bias As Long
   StandardName(63) As Byte
   StandardDate As SYSTEMTIME
   StandardBias As Long
   DaylightName(63) As Byte
   DaylightDate As SYSTEMTIME
   DaylightBias As Long
End Type

Declare Function GetTimeZoneInformation Lib "kernel32" _
    (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

Function GetCurrentTimeBias() As Currency
Const TIME_ZONE_ID_DAYLIGHT As Long = 2
Dim tzi As TIME_ZONE_INFORMATION
Dim dwBias As Long

If GetTimeZoneInformation(tzi) = TIME_ZONE_ID_DAYLIGHT Then
   dwBias = tzi.Bias + tzi.DaylightBias
Else
   dwBias = tzi.Bias + tzi.StandardBias
End If

GetCurrentTimeBias = dwBias / 60
 
End Function