B4J Code Snippet Get Boot Up time of a Windows PC...

Well...
before some days ASK if someone knows a time/data format... explained here.

I ve create a small snippet - if someone wants to know what date/time bootup last time your Windows PC...

how to use it:
B4X:
    Wait for (BootUpTime) complete (bootup As Long)
    Log(bootup)
    DateTime.DateFormat="dd/MM/yyyy"  'You can give your Date format here...
    Log(DateTime.Date(bootup))
    Log(DateTime.time(bootup))

code need to add:
B4X:
Sub BootUpTime As ResumableSub
    'yyyymmddhhmmss.nnn
    Dim bootticks As Long
    Dim js As Shell
    Dim params As List
    params.Initialize

    params.Add("os")
    params.Add("get")
    params.Add("lastbootuptime")
    params.Add("/format:csv")
  
    js.Initialize("js", "wmic.exe", params)
    js.WorkingDirectory=File.DirApp
    js.Run(-1)
    Wait for (js) js_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
  
    If Success=True Then
        Log(StdOut)
        Dim nlines() As String=Regex.Split(Chr(13) & Chr(10),StdOut)
        Dim cols() As String=Regex.Split(",",nlines(2))

        DateTime.DateFormat="yyyyMMddhhmmss" '.SSS  ?? millisecond... hmm are you sure need them ?
      
        bootticks=DateTime.DateParse(cols(1).Trim)
      
    End If
  
    Return bootticks
End Sub
 
Last edited:

JackKirk

Well-Known Member
Licensed User
Longtime User
I happened to run this on the day daylight saving dropped back an hour - and it was out by -3600 seconds.

Tossed this to MS Copilot which after several loops came up with the following that seems to work correctly:

B4X:
Public Sub Boot_up_time As ResumableSub
   
    Private wrk_shell As Shell
    Private wrk_params As List
    wrk_params.Initialize

    wrk_params.Add("os")
    wrk_params.Add("get")
    wrk_params.Add("lastbootuptime")
    wrk_params.Add("/format:csv")

    wrk_shell.Initialize("boot", "wmic.exe", wrk_params)
    wrk_shell.Run(-1)

    Wait For (wrk_shell) boot_ProcessCompleted (Success As Boolean, ExitCode As Int, StdOut As String, StdErr As String)
    If Success = False Then Return 0

    Private wrk_lines() As String = Regex.Split(Chr(13) & Chr(10), StdOut)
    Private wrk_cols() As String = Regex.Split(",", wrk_lines(2))
    Private wrk_raw  As String = wrk_cols(1).Trim

    'Extract main timestamp yyyyMMddHHmmss
    Private wrk_base As String = wrk_raw.SubString2(0, wrk_raw.IndexOf("."))

    'Extract UTC offset (signed minutes)
    Private wrk_plus As Int = wrk_raw.IndexOf("+")
    Private wrk_minus As Int = wrk_raw.IndexOf("-")
    Private wrk_offsetstr As String

    If wrk_plus > -1 Then
        wrk_offsetstr = wrk_raw.SubString(wrk_plus)
    Else If wrk_minus > -1 Then
        wrk_offsetstr = wrk_raw.SubString(wrk_minus)
    Else
        wrk_offsetstr = "+000"
    End If

    Private wrk_offsetminutes As Int = wrk_offsetstr   ' <-- SIGN PRESERVED

    'Parse components
    Private wrk_year As Int = wrk_base.SubString2(0, 4)
    Private wrk_month As Int = wrk_base.SubString2(4, 6)
    Private wrk_day As Int = wrk_base.SubString2(6, 8)
    Private wrk_hour As Int = wrk_base.SubString2(8, 10)
    Private wrk_minute As Int = wrk_base.SubString2(10, 12)
    Private wrk_second As Int = wrk_base.SubString2(12, 14)

    'Convert to local ticks
    Private wrk_localticks As Long = DateUtils.SetDateAndTime(wrk_year, wrk_month, wrk_day, wrk_hour, wrk_minute, wrk_second)

    'Convert WMIC offset (minutes) to milliseconds
    Private wrk_offsetms As Long = wrk_offsetminutes * DateTime.TicksPerMinute

    'Convert WMIC local time → UTC
    Private wrk_utcTicks As Long = wrk_localticks - wrk_offsetms
   
    'Convert UTC → local time (DST‑safe)
    Private wrk_tzoffsetms As Long = DateTime.TimeZoneOffset * DateTime.TicksPerHour
    Return wrk_utcTicks + wrk_tzoffsetms

End Sub
 
Top