Search code examples
dategroovytimeepochjenkins-groovy

Groovy - Convert a timestamp string to Epoch time in milliseconds


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?


Solution

  • 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)