Java create date with timezone

How do I display a date with a custom timezone?

Lets say I have a string that represents a date that looks like this: «Wed Jul 08 17:08:48 GMT 2009» So I parse that string into a date object like this:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy"); Date fromDate = (Date)formatter.parse(fromDateString); 

That gives me the correct date object. Now I want to display this date as a CDT value. I’ve tried many things, and I just can’t get it to work correctly. There must be a simple method using the DateFormat class to get this to work. Any advice? My last attempt was this:

formatter.setTimeZone(toTimeZone); String result = formatter.format(fromDate); 

4 Answers 4

Use «zzz» instead of «ZZZ»: «Z» is the symbol for an RFC822 time zone.

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 

Having said that, my standard advice on date/time stuff is to use Joda Time, which is an altogether better API.

EDIT: Short but complete program:

import java.text.*; import java.util.*; public class Test < public Listnames; public static void main(String [] args) throws Exception // Just for simplicity! < String fromDateString = "Wed Jul 08 17:08:48 GMT 2009"; DateFormat formatter = new SimpleDateFormat ("EEE MMM dd HH:mm:ss zzz yyyy"); Date fromDate = (Date)formatter.parse(fromDateString); TimeZone central = TimeZone.getTimeZone("America/Chicago"); formatter.setTimeZone(central); System.out.println(formatter.format(fromDate)); >> 

Output: Wed Jul 08 12:08:48 CDT 2009

Sadly I can’t add another dependency without more red tape that I want to deal with. There must be a way to format the time zones using standard java libraries.

There is, as given in the answer. Just expect more pain if you have to any other date/time manipulation.

Then you’re using the wrong time zone — it worked fine in my test case. I’ll add a short but complete program to demonstrate.

Yeah, you were right. man that’s a pain. Had the correct code the whole time and a typo in my unit test prevented it from working correctly.

formatter.setTimeZone(TimeZone.getTimeZone("US/Central")); 
Wed Jul 08 12:08:48 CDT 2009 

for the date in your example on my machine. That is after substituting zzz for ZZZ in the format string.

Sorry for digging out an old-thread. But I was wondering if there is a java-class that holds all the time-zone-ids as a constant class. So instead of having to hard-code the time-zone-id while setting time-zone like this:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central")); 

we would instead be doing something more standard/uniform:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

where SomeConstantClass.java is a class that holds the constants referring to the different time-zone-ids that are supported by the TimeZone class.

The modern way is with the java.time classes.

Читайте также:  Font family html примеры

ZonedDateTime

Specify a formatting pattern to match your input string. The codes are similar to SimpleDateFormat but not exactly. Be sure to read the class doc for DateTimeFormatter . Note that we specify a Locale to determine what human language to use for name of day-of-week and name of month.

String input = "Wed Jul 08 17:08:48 GMT 2009"; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH ); ZonedDateTime zdt = ZonedDateTime.parse ( input , f ); 

We can adjust that into any other time zone.

Specify a proper time zone name in the format of continent/region . Never use the 3-4 letter abbreviation such as CDT or EST or IST as they are not true time zones, not standardized, and not even unique(!).

I will guess that by CDT you meant a time zone like America/Chicago .

ZoneId z = ZoneId.of( "America/Chicago" ); ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z ); 

Instant

Generally best to work in UTC. For that extract an Instant . The Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).

This Instant class is a basic building-block class of java.time. You can think of ZonedDateTime as an Instant plus a ZoneId .

Instant instant = zdtChicago.toInstant(); 

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date , .Calendar , & java.text.SimpleDateFormat .

The Joda-Time project, now in maintenance mode, advises migration to java.time.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

  • Java SE 8 and SE 9 and later
    • Built-in.
    • Part of the standard Java API with a bundled implementation.
    • Java 9 adds some minor features and fixes.
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
    • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
    • See How to use….

    The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval , YearWeek , YearQuarter , and more.

    Источник

    Set the Time Zone of a Date in Java

    announcement - icon

    Repeatedly, code that works in dev breaks down in production. Java performance issues are difficult to track down or predict.

    Simply put, Digma provides immediate code feedback. As an IDE plugin, it identifies issues with your code as it is currently running in test and prod.

    The feedback is available from the minute you are writing it.

    Imagine being alerted to any regression or code smell as you’re running and debugging locally. Also, identifying weak spots that need attending to, based on integration testing results.

    Of course, Digma is free for developers.

    announcement - icon

    As always, the writeup is super practical and based on a simple application that can work with documents with a mix of encrypted and unencrypted fields.

    We rely on other people’s code in our own work. Every day.

    It might be the language you’re writing in, the framework you’re building on, or some esoteric piece of software that does one thing so well you never found the need to implement it yourself.

    The problem is, of course, when things fall apart in production — debugging the implementation of a 3rd party library you have no intimate knowledge of is, to say the least, tricky.

    Lightrun is a new kind of debugger.

    It’s one geared specifically towards real-life production environments. Using Lightrun, you can drill down into running applications, including 3rd party dependencies, with real-time logs, snapshots, and metrics.

    Learn more in this quick, 5-minute Lightrun tutorial:

    announcement - icon

    Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.

    The Jet Profiler was built for MySQL only, so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.

    Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.

    Basically, you install the desktop application, connect to your MySQL server, hit the record button, and you’ll have results within minutes:

    announcement - icon

    DbSchema is a super-flexible database designer, which can take you from designing the DB with your team all the way to safely deploying the schema.

    The way it does all of that is by using a design model, a database-independent image of the schema, which can be shared in a team using GIT and compared or deployed on to any database.

    And, of course, it can be heavily visual, allowing you to interact with the database using diagrams, visually compose queries, explore the data, generate random data, import data or build HTML5 database reports.

    Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

    > CHECK OUT THE COURSE

    1. Overview

    In this quick tutorial, we’ll see how to set the time zone of a date using Java 7, Java 8 and the Joda-Time library.

    2. Using Java 8

    Java 8 introduced a new Date-Time API for working with dates and times which was largely based off of the Joda-Time library.

    The Instant class from Java Date Time API models a single instantaneous point on the timeline in UTC. This represents the count of nanoseconds since the epoch of the first moment of 1970 UTC.

    First, we’ll obtain the current Instant from the system clock and ZoneId for a time zone name:

    Instant nowUtc = Instant.now(); ZoneId asiaSingapore = ZoneId.of("Asia/Singapore");

    Finally, the ZoneId and Instant can be utilized to create a date-time object with time-zone details. The ZonedDateTime class represents a date-time with a time-zone in the ISO-8601 calendar system:

    ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);

    We’ve used Java 8’s ZonedDateTime to represent a date-time with a time zone.

    3. Using Java 7

    In Java 7, setting the time-zone is a bit tricky. The Date class (which represents a specific instant in time) doesn’t contain any time zone information.

    First, let’s get the current UTC date and a TimeZone object:

    Date nowUtc = new Date(); TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);

    In Java 7, we need to use the Calendar class to represent a date with a time zone.

    Finally, we can create a nowUtc Calendar with the asiaSingapore TimeZone and set the time:

    Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore); nowAsiaSingapore.setTime(nowUtc);

    It’s recommended to avoid the Java 7 date time API in favor of Java 8 date time API or the Joda-Time library.

    4. Using Joda-Time

    If Java 8 isn’t an option, we can still get the same kind of result from Joda-Time, a de-facto standard for date-time operations in the pre-Java 8 world.

    First, we need to add the Joda-Time dependency to pom.xml:

    To represent an exact point on the timeline we can use Instant from org.joda.time package. Internally, the class holds one piece of data, the instant as milliseconds from the Java epoch of 1970-01-01T00:00:00Z:

    Instant nowUtc = Instant.now();

    We’ll use DateTimeZone to represent a time-zone (for the specified time zone id):

    DateTimeZone asiaSingapore = DateTimeZone.forID("Asia/Singapore");

    Now the nowUtc time will be converted to a DateTime object using the time zone information:

    DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);

    This is how Joda-time API can be used to combine date and time zone information.

    5. Conclusion

    In this article, we found out how to set the time zone in Java using Java 7, 8 and Joda-Time API. To learn more about Java 8’s date-time support check out our Java 8 date-time intro.

    As always the code snippet is available in the GitHub repository.

    announcement - icon

    Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.

    The Jet Profiler was built for MySQL only, so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.

    Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.

    Basically, you install the desktop application, connect to your MySQL server, hit the record button, and you’ll have results within minutes:

    Источник

Оцените статью