Main Tutorials

Java 8 – Convert ZonedDateTime to Timestamp

Java example to convert java.time.ZonedDateTime to java.sql.Timestamp and vice verse.

1. ZonedDateTime -> Timestamp

TimeExample1.java

package com.mkyong.jdbc;

import java.sql.Timestamp;
import java.time.ZonedDateTime;

public class TimeExample1 {

    public static void main(String[] args) {

        ZonedDateTime now = ZonedDateTime.now();

        // 1. ZonedDateTime to TimeStamp
        Timestamp timestamp = Timestamp.valueOf(now.toLocalDateTime());

        // 2. ZonedDateTime to TimeStamp , no different
        Timestamp timestamp2 = Timestamp.from(now.toInstant());

        System.out.println(now);		// 2019-06-19T14:12:13.585294800+08:00[Asia/Kuala_Lumpur]

        System.out.println(timestamp);	// 2019-06-19 14:12:13.5852948

        System.out.println(timestamp2);	// 2019-06-19 14:12:13.5852948

    }
}

Output


2019-06-19T14:12:13.585294800+08:00[Asia/Kuala_Lumpur]
2019-06-19 14:12:13.5852948
2019-06-19 14:12:13.5852948

2. Timestamp -> ZonedDateTime

TimeExample2.java

package com.mkyong;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class TimeExample2 {

    public static void main(String[] args) {

        Timestamp timestamp = Timestamp.from(Instant.now());

        LocalDateTime localDateTimeNoTimeZone = timestamp.toLocalDateTime();

        ZonedDateTime zonedDateTime1 = localDateTimeNoTimeZone.atZone(ZoneId.of("+08:00"));

        ZonedDateTime zonedDateTime2 = localDateTimeNoTimeZone.atZone(ZoneId.of("Asia/Kuala_Lumpur"));

        ZonedDateTime zonedDateTime3 = localDateTimeNoTimeZone.atZone(ZoneId.systemDefault());

        ZonedDateTime zonedDateTime4 = localDateTimeNoTimeZone.atZone(ZoneId.of("-08:00"));

        System.out.println(timestamp);      // 2019-06-19 14:08:23.4458984

        System.out.println(zonedDateTime1); // 2019-06-19T14:08:23.445898400+08:00

        System.out.println(zonedDateTime2); // 2019-06-19T14:08:23.445898400+08:00[Asia/Kuala_Lumpur]

        System.out.println(zonedDateTime3); // 2019-06-19T14:08:23.445898400+08:00[Asia/Kuala_Lumpur]

        System.out.println(zonedDateTime4); // 2019-06-19T14:08:23.445898400-08:00

    }
}

Output


2019-06-19 14:08:23.4458984
2019-06-19T14:08:23.445898400+08:00
2019-06-19T14:08:23.445898400+08:00[Asia/Kuala_Lumpur]
2019-06-19T14:08:23.445898400+08:00[Asia/Kuala_Lumpur]
2019-06-19T14:08:23.445898400-08:00

References

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
6 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Someone
4 years ago

The following two are NOT same:
// 1. ZonedDateTime to TimeStamp
Timestamp timestamp = Timestamp.valueOf(now.toLocalDateTime());

// 2. ZonedDateTime to TimeStamp , no different
Timestamp timestamp2 = Timestamp.from(now.toInstant());

ZonedDateTime.toLocalDateTime() does not consider timezone or offset.

Sam
2 years ago
Reply to  Someone

Wondering why this hasn’t been corrected?

Nagendra Singh Krishnawat
4 years ago

I wanted to get timestamp of a specific date,Specific location I passed as string. Here “20200206-000001” is that string, its a past date and specific location Germany.

I did following:

Timestamp.valueOf(LocalDateTime.parse(“20200206-000001”, DateTimeFormatter.ofPattern(“yyyyMMdd-HHmmss”)).atZone(ZoneId.of(“Europe/Berlin”)).toLocalDateTime())

But this doesn’t give correct timestamp value.

Nagendra
4 years ago

Solution is:
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.parse(beginOfDay, DateTimeFormatter.ofPattern(“yyyyMMdd-HHmmss”)), UTC);
System.out.println(zonedDateTime.toEpochSecond());

Nagendra Singh Krishnawat
4 years ago

Basically:
Timestamp timestampGermany = Timestamp.valueOf(LocalDateTime.parse(“20200206-000001”, DateTimeFormatter.ofPattern(“yyyyMMdd-HHmmss”)).atZone(ZoneId.of(“Europe/Berlin”)).toLocalDateTime());
Timestamp timestampLosAngles = Timestamp.valueOf(LocalDateTime.parse(“20200206-000001”, DateTimeFormatter.ofPattern(“yyyyMMdd-HHmmss”)).atZone(ZoneId.of(“America/Los_Angeles”)).toLocalDateTime());
System.out.println(“timestampGermany:” + timestampGermany.getTime() + ” timestampUSA: ” + timestampLosAngles.getTime() + ” ” + “TS:” + timestampLosAnglesAgain.getTime());

All these give same time which doesnt look right.

Nagendra
4 years ago

Solution is:
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.parse(beginOfDay, DateTimeFormatter.ofPattern(“yyyyMMdd-HHmmss”)), UTC);
System.out.println(zonedDateTime.toEpochSecond());