androiddatelocalethai

Correct current way on Android to get the current year in Thai digits?


I only have limited experience in Java libraries and in Android programming.

In Thailand both western (Arabic) digits and Thai digits are used. 2023 = ๒๐๒๓

Thailand also uses both the western calendar and the Thai Buddhist calendar. 2023 = 2566.

I know how to get a Thai locale Locale.forLanguageTag("th-TH") and how to get a version using Thai digits Locale.forLanguageTag("th-TH-u-nu-thai")

I know I can format a whole date in various Thai compatible ways using code like this:

val thaiNumberLocale = Locale.forLanguageTag("th-TH-u-nu-thai")
val thaiDecimalStyle = DecimalStyle.of(thaiNumberLocale)
val currentDateTime = LocalDateTime.now()
val formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
val date = formatter
    .withLocale(thaiNumberLocale)
    .withDecimalStyle(thaiDecimalStyle)
    .withChronology(ThaiBuddhistChronology.INSTANCE)
    .format(currentDateTime)

I know I can get just the day of the week or the month in Thai locale/Thai script with code like this:

val dayOfWeekInThai = currentDateTime.dayOfWeek.getDisplayName(TextStyle.FULL, thaiLocale)
val dayOfWeekInEnglish = currentDateTime.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH)

But now I don't want a whole formatted date string. I just want the year. But I want to be able to get it in Thai digits. This I can't figure out how to do using APIs related to those in the code shown.

I realize I can do text conversion a character at a time if I have to. But I'm assuming this functionality exists in the Java date/time and locale APIs and that I just can't find it.

Please, what am I missing?


Solution

  • Indeed I was missing something.

    For DateTimeFormatter there were several built in formatters such as I showed in my code in my question:

    val formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
    

    But you can also make a formatter from a pattern, and you can make a pattern with just a year like this:

    val formatter = DateTimeFormatter.ofPattern("yyyy")
    

    So you can use a formatter with such a year-only pattern in conjunction with either or both .withDecimalStyle() to get Thai digits and .withChronology(ThaiBuddhistChronology.INSTANCE) to get Thai Buddhist years.

    Here's the Jetpack Compose code I used to display all four combinations as an example:

    val now = LocalDateTime.now()
    val fmt = DateTimeFormatter.ofPattern("yyyy")
    
    val chronologies = listOf(IsoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE)
    val decimalStyles = listOf(DecimalStyle.STANDARD, DecimalStyle.of(Locale.forLanguageTag("th-TH-u-nu-thai")))
    
    chronologies.forEach() { chr ->
        decimalStyles.forEach() { dec ->
            val year = fmt
                .withChronology(chr)
                .withDecimalStyle(dec)
                .format(now)
            Text(text = year)
        }
    }
    

    screenshot