The java.util.Date class has been outmoded by the new java.time package (Tutorial) in Java 8 and later. The old java.util.Date/.Calendar classes are notoriously troublesome, confusing, and flawed. Avoid them.
Get the current moment in java.time.
ZonedDateTime now = ZonedDateTime.now();
- Time-of-day, with a fraction of a second to nanosecond resolution.
- Time zone.
If no time zone is specified, your JVM’s current default time zone is assigned silently. Better to specify your desired/expected time zone than rely implicitly on default.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );
Generally better to get in the habit of doing your back-end work (business logic, database, storage, data exchange) all in UTC time zone. The code above relies implicitly on the JVM’s current default time zone.
Instant class represents a moment in the timeline in UTC with a resolution of nanoseconds.
Instant instant = Instant.now();
Instant class is a basic building-block class in java.time and may be used often in your code.
When you need more flexibility in formatting, transform into an
OffsetDateTime. Specify a
ZoneOffset object. For UTC use the handy constant for UTC.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
You easily adjust to another time zone for presentation to the user. Use a proper time zone name, never the 3-4 letter codes such as
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );
Generate a String representation of that date-time value, localized.
String output = DateTimeFormatter
.ofLocalizedDate( FormatStyle.FULL )
.withLocale( Locale.CANADA_FRENCH )
.format ( nowMontreal );
Or, to stay in UTC, use
Instant object represents a moment on the timeline, to nanosecond resolution, always in UTC. This provides the building block for a zoned date-time, along with a time zone assignment. You can think of it conceptually this way:
You can extract an
Instant from a
Instant instantNow = zdt.toInstant();
You can start with an Instant. No need to specify a time zone here, as
Instant is always in UTC.
Instant now = Instant.now();