Groovy - Convert a timestamp string to Epoch time in milliseconds

19,470

You can achieve this using java's java.time.* package. Below is working script and output from running groovy via docker. I haven't tried this within Jenkins though, and script may require adding appropriate def statements to avoid pipeline serialization issues

Script

import java.time.*

// build time as string
build_time='2017-11-20T21:27:03Z'

// parse and get epoch
time=Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", build_time)

// get epoch milis
epoch_milis = time.getTime()

// create UTC local time
local_dt = LocalDateTime.ofInstant(Instant.ofEpochMilli(epoch_milis), ZoneId.of('UTC'));

// created zoned time out of UTC time
zoned_dt = local_dt.atZone(ZoneId.of('America/Los_Angeles'))

// get offset in milis
offset_ms = zoned_dt.getOffset().getTotalSeconds() * 1000

// add to UTC epoc
local_timestamp = epoch_milis + offset_ms

println "Time is ${local_timestamp}"

Script output, running in groovy REPL

$ docker run --rm -it groovy
Nov 21, 2017 3:37:26 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Groovy Shell (2.4.12, JVM: 1.8.0_141)
Type ':help' or ':h' for help.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> import java.time.*
===> java.time.*
groovy:000> 
groovy:000> // build time as string
===> true
groovy:000> build_time='2017-11-20T21:27:03Z'
===> 2017-11-20T21:27:03Z
groovy:000> 
groovy:000> // parse and get epoch
===> true
groovy:000> time=Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", build_time)
===> Mon Nov 20 21:27:03 UTC 2017
groovy:000> 
groovy:000> // get epoch milis
===> true
groovy:000> epoch_milis = time.getTime()
===> 1511213223000
groovy:000> 
groovy:000> // create UTC local time
===> true
groovy:000> local_dt = LocalDateTime.ofInstant(Instant.ofEpochMilli(epoch_milis), ZoneId.of('UTC'));
===> 2017-11-20T21:27:03
groovy:000> 
groovy:000> // created zoned time out of UTC time
===> true
groovy:000> zoned_dt = local_dt.atZone(ZoneId.of('America/Los_Angeles'))
===> 2017-11-20T21:27:03-08:00[America/Los_Angeles]
groovy:000> 
groovy:000> // get offset in milis
===> true
groovy:000> offset_ms = zoned_dt.getOffset().getTotalSeconds() * 1000
===> -28800000
groovy:000> 
groovy:000> // add to UTC epoc
===> true
groovy:000> local_timestamp = epoch_milis + offset_ms
===> 1511184423000
groovy:000> 
groovy:000> println "Time is ${local_timestamp}"
Time is 1511184423000

Also, in your example you're giving result of 1511299623000 ms, which seems to be 24 hours ahead of timestamp, looking at javascript console, with inputs from your example

new Date('2017-11-20T21:27:03Z')
>> Tue Nov 21 2017 08:27:03 GMT+1100 (AEDT)

new Date(1511299623000)
>> Wed Nov 22 2017 08:27:03 GMT+1100 (AEDT)
Share:
19,470

Related videos on Youtube

activelearner
Author by

activelearner

Updated on May 26, 2022

Comments

  • activelearner
    activelearner almost 2 years

    I have a timestamp string as follows:

    String build_time=2017-11-20T21:27:03Z
    

    I want to convert it into epoch time in milliseconds as per the PST time zone such that my result is:

    long build_time_ms=1511299623000
    

    How can I do this?

    • Rao
      Rao over 6 years
      What s the source time's timezone?
    • Anthony Fammartino
      Anthony Fammartino over 6 years
      What have you tried? Have you tried it in Java? (if you know Java ... the reason I ask is that such solutions are readily migrated to Groovy)
    • activelearner
      activelearner over 6 years
      Source time's timezone is GMT @Rao
  • MarkHu
    MarkHu about 6 years
    Sometimes if you don't need/want the import then just try groovy -e "println new Date().time / 1000"