5

I need to get the first day of week for a certain Locale / Country.

I tried to find it using this code:

final Locale[] locales = new Locale[]{
        new Locale("en_GB"),
        new Locale("ru_RU"),
        new Locale("en_US"),                
        new Locale("es_ES"),
        new Locale("fr_FR"),        
        new Locale("iw_IL"),
        new Locale("he_IL")
};

for (final Locale locale : locales) {
    final Calendar cal = Calendar.getInstance(locale);
    final int firstDayOfWeek = cal.getFirstDayOfWeek();
    System.out.println(firstDayOfWeek);
}

The result of this code is that all of these locales are retrieving '1' which is Sunday, and locales such en_US should return 2 which is Monday.

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
roeygol
  • 4,908
  • 9
  • 51
  • 88
  • I would have expected Sunday for the USA, but Monday for UK and France. – Ole V.V. Sep 17 '18 at 10:25
  • 3
    The `Calendar` class is long outdated and was always poorly designed. You need `WeekFields.of(locale).getFirstDayOfWeek()`. – Ole V.V. Sep 17 '18 at 10:27
  • 1
    This worked for me: `Locale.forLanguageTag("en-GB")` (note hyphen instead of underscore). Docs: [Creating a Locale](https://docs.oracle.com/javase/tutorial/i18n/locale/create.html). – Ole V.V. Sep 17 '18 at 10:44

2 Answers2

13

Pass in two arguments – language & country, separately – rather than your string with underscore. See Oracle Tutorial.

final Locale[] locales = new Locale[]{
        new Locale("en", "GB"),  // Pass language code, then country code, separately.
        new Locale("ru", "RU"),
        new Locale("en", "US"),
        new Locale("es", "ES"),
        new Locale("fr", "FR"),
        new Locale("iw", "IL"),
        new Locale("he", "IL")
    };

And then I would use Java8 to get the first day of the week:

DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
System.out.println(firstDayOfWeek);

Output:

MONDAY

MONDAY

SUNDAY

MONDAY

MONDAY

SUNDAY

SUNDAY

Community
  • 1
  • 1
achAmháin
  • 4,176
  • 4
  • 17
  • 40
4

You have a mistake in initializing the Locale, you need to pass two arguments language and country. The single argument constructor is only for language.

For example for Locale("en_GB"), should be Locale("en", "GB"), and then the result will be 2.

BTW for Locale("en", "US") the result is 1 (Sunday).

tdelev
  • 843
  • 7
  • 8
  • 1
    Very correct answer. But better to stop using the outdated `Calendar` class. I can never remember whether it numbers the days from Sunday or Monday, nor whether from 0 or 1, so telling me the result is 2 for GB and 1 for US doesn’t really convince me unless I dig deep into the documentation to check what those numbers mean. – Ole V.V. Sep 17 '18 at 11:40