TL; DR
As noted in the comment, you confuse the use of the Locale object with the time zone. The locale has nothing to do with the time zone, and the locale does not affect the date and time value. A locale only affects the formatting of the string used to represent the date and time value.
When capturing the current moment, no language is required. But we need a time zone.
Instant.now().atZone( ZoneId.of( "America/Montreal" ) )
... or a shorter version ...
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
java.time
You use the nasty old obsolete time classes that are now superseded by java.time classes.
Work at UTC
Most of your business logic, data storage, and data exchange should be in UTC format. Think of UTC as "One True Time."
Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds .
Instant instant = Instant.now();
Specify time zone
As you found out, you should always indicate your desired / expected time zone. At any point in time and time of day, they vary throughout the world by zone.
Specify the time zone name in the format continent/region . Never use the abbreviation 3-4 letters, for example EST or IST , as they are not real time zones, and are not standardized and not even unique (!).
ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z );
Specify the locale
Remember that the time zone and locale are orthogonal, completely separate issues.
- The time zone determines the value of the date-time, as we consider its wall clock time .
- The language defines (a) human language for translating the name of the day, the name of the month, etc. and (b) cultural norms that address issues of contraction, capitalization, punctuation, etc.
This means that we can mix and match any time zone with any locale. We can have a date-time in the Europe/Paris zone with the Locale.KOREA Locale.KOREA . Or the Pacific/Auckland zone with Locale.CANADA_FRENCH .
Thus, the locale only affects the date-time representation, as we generate a string representation of the date-time.
You can specify your own formatting template for generating strings. But it is better to allow java.time to automatically localize.
Locale l = Locale.CANADA_FRENCH ; DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ) .withLocale( l ); String output = zdt.format( f );
About java.time
The java.time framework is built into Java 8 and later. These classes supersede the nasty old legacy time classes such as java.util.Date , Calendar and SimpleDateFormat .
The Joda-Time project, now in maintenance mode , we recommend switching to the java.time classes.
To learn more, see the Oracle Tutorial . And search for qaru for many examples and explanations. JSR 310 specification .
Where to get java.time classes?
The ThreeTen-Extra project extends java.time with additional classes. This project is proof of possible future additions to java.time. Here you can find useful classes such as Interval , YearWeek , YearQuarter and more .