Converting Between java.sql.Timestamp and ZonedDateTime in Java
In Java, conversion between java.sql.Timestamp and java.time.ZonedDateTime can be essential for applications that interact with legacy systems that require this specific type and need to handle date and time operations. This guide will show various approaches to performing these conversions with code examples.
1. Overview
java.sql.Timestamp is a legacy class used for handling SQL TIMESTAMP data types, while java.time.ZonedDateTime is part of the modern Java Date-Time API introduced in Java 8. Converting between these two classes involves understanding their differences and using appropriate methods to bridge the gap.
1.1 Key Differences
java.sql.Timestamp: Represents a specific point in time, down to nanoseconds. It inherits fromjava.util.Dateand is time-zone agnostic.java.time.ZonedDateTime: Represents a date-time with a time-zone in the ISO-8601 calendar system.
2. Converting java.sql.Timestamp to ZonedDateTime
2.1 Approach 1: Using toInstant Method
The Timestamp class has a toInstant method that can convert the Timestamp to an Instant. We can then convert this Instant to a ZonedDateTime.
TimeStampToZonedDateTime.java
public class TimeStampToZonedDateTime {
public static void main(String[] args) {
// Current time as Timestamp
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
// Convert to Instant
Instant instant = timestamp.toInstant();
// Convert Instant to ZonedDateTime with system default time zone
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
// Print results
System.out.println("Timestamp: " + timestamp);
System.out.println("ZonedDateTime: " + zonedDateTime);
}
}
The code block creates a Timestamp object representing the current time. Next, it converts the Timestamp to an Instant, a point in time with nanosecond precision. It then converts the Instant to a ZonedDateTime, which includes time-zone information using the system’s default time zone. From the location where the program is run, I get the following output:

java.sql.Timestamp to ZonedDateTime using the toInstant method.2.2 Using Joda-Time Library
Joda-Time is a popular date and time manipulation library for Java applications. Developed to address limitations and complexities in the original Java date-time APIs, Joda-Time offers a comprehensive approach to handling date, time, and time zone-related operations.
To use the Joda-Time library in your project, first, you need to add the Joda-Time dependency to your pom.xml file if you are using Maven. Here is how you can add it:
pom.xml
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.7</version>
</dependency>
Ensure you update the version to the latest available version if it differs.
Next, convert java.sql.Timestamp to org.joda.time.DateTime, and then to java.time.ZonedDateTime, following these steps:
ConvertToZonedDateTimeUsingJodaTime.java
public class ConvertToZonedDateTimeUsingJodaTime {
public static void main(String[] args) {
// Current time as Timestamp
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
// Convert to Joda-Time DateTime
DateTime jodaDateTime = new DateTime(timestamp.getTime());
// Convert Joda-Time DateTime to java.time.ZonedDateTime
ZonedDateTime zonedDateTime = jodaDateTime.toGregorianCalendar().toZonedDateTime();
// Print results
System.out.println("Timestamp: " + timestamp);
System.out.println("Joda-Time DateTime: " + jodaDateTime);
System.out.println("ZonedDateTime: " + zonedDateTime);
}
}
This code snippet demonstrates the process of converting the current time from a java.sql.Timestamp to an org.joda.time.DateTime, and then to a java.time.ZonedDateTime. It begins by creating a Timestamp object representing the current time. This Timestamp is then converted into a DateTime object using the Joda-Time library. Subsequently, the DateTime is converted into a ZonedDateTime by first converting it to a GregorianCalendar and then to a ZonedDateTime.
Example Output:
Timestamp: 2024-06-26 13:18:28.336 Joda-Time DateTime: 2024-06-26T13:18:28.336+01:00 ZonedDateTime: 2024-06-26T13:18:28.336+01:00[Africa/Lagos]
Note: The actual time values and time zone might differ based on when and where the code is executed.
3. Converting ZonedDateTime to java.sql.Timestamp
Now, let’s explore how to convert a ZonedDateTime to a java.sql.Timestamp.
3.1 Using toInstant and Timestamp.from
To convert a ZonedDateTime to a Timestamp, we can use the toInstant method to get an Instant and then convert this Instant to a Timestamp.
ZonedDateTimeToTimeStamp.java
public class ZonedDateTimeToTimeStamp {
public static void main(String[] args) {
// Current time as ZonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// Convert to Instant
Instant instant = zonedDateTime.toInstant();
// Convert Instant to Timestamp
Timestamp timestamp = Timestamp.from(instant);
// Print results
System.out.println("ZonedDateTime: " + zonedDateTime);
System.out.println("Timestamp: " + timestamp);
}
}
This code snippet begins by obtaining an Instant representation of the ZonedDateTime using the toInstant method. This Instant captures the exact moment in time without any time zone information. Then, utilizing the Timestamp.from method, the Instant is converted back into a java.sql.Timestamp which is suitable for interacting with legacy systems that require this specific type.
3.2 Using Joda-Time Library
Let’s now explore how we can convert ZonedDateTime to java.sql.Timestamp using the Joda-Time class.
JodaDateTimeToTimestamp.java
public class JodaDateTimeToTimestamp {
public static void main(String[] args) {
// Current time as ZonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// Current time as Joda-Time DateTime
DateTime jodaDateTime = new DateTime(zonedDateTime.toInstant().toEpochMilli());
// Convert Joda-Time DateTime to java.sql.Timestamp
Timestamp timestamp = new Timestamp(jodaDateTime.getMillis());
// Print results
System.out.println("Joda-Time DateTime: " + jodaDateTime);
System.out.println("Timestamp: " + timestamp);
}
}
The above code snippet retrieves the current time as a ZonedDateTime using the system’s default time-zone. It then converts this ZonedDateTime to an Instant and subsequently to milliseconds since the Unix epoch. Using these milliseconds, it initializes a DateTime object from the Joda-Time library. Next, it converts this DateTime object to a java.sql.Timestamp.
Output is:
Joda-Time DateTime: 2024-06-26T14:07:12.196+01:00 Timestamp: 2024-06-26 14:07:12.196
4. Conclusion
In this article, we explored some methods and libraries for converting between java.sql.Timestamp and ZonedDateTime in Java. We began by using the java.time package’s toInstant method to convert from Timestamp to ZonedDateTime. Additionally, we delved into utilizing the Joda-Time library for these conversions.
5. Download the Source Code
This article covers the conversion between Java SQL Timestamp and ZonedDateTime.
You can download the full source code of this example here: Java SQL Timestamp Zoneddatetime conversion

