Анализ даты в определенном формате с использованием тайского календаря в Android

Для приложения для Android мне нужно проанализировать дату в тайском локальном формате (например, 2019 год должен быть возвращен как 2562). Я не понимаю, как я могу это сделать. В настоящее время используется SimpleDateFormatter для анализа даты в локальном формате по умолчанию.

fun adjustTimePattern(dateString: String, oldPattern: String, newPattern: String): String? {
    val dateFormat = SimpleDateFormat(oldPattern, Locale.getDefault())
    dateFormat.timeZone = TimeZone.getTimeZone("UTC")
    return try {
        val calendar = Calendar.getInstance()
        calendar.time = dateFormat.parse(dateString)
        val newFormat = SimpleDateFormat(newPattern, Locale.getDefault())
        newFormat.format(calendar.time)
    } catch (e: ParseException) {
        return null
    }
}

Пытался жестко закодировать значение локали (использовал Locale("th", "TH") вместо Locale.getDefault()), но ему повезло, поскольку класс SimpleDateFormat использует сам григорианский календарь.

Пробовали также использовать LocalDate и DateTimeFormatter, но значение года никоим образом не меняется.

fun formatTime(pattern: String): String {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val formatter = DateTimeFormatter.ofPattern(pattern, Locale("th", "TH"))
        LocalDate.now().format(formatter)
    } else {
        ""
    }
}

.

Может ли кто-нибудь помочь мне в этом?


person Sudip Podder    schedule 24.10.2019    source источник
comment
Вы должны предпочесть классы из java.time, современного API даты и времени Java . Однако LocalDate по своей сути является датой в ISO/пролептическом григорианском календаре, поэтому не будет работать для тайских дат. Ответ показывает решение, которое я считаю отличным.   -  person Ole V.V.    schedule 24.10.2019


Ответы (2)


ThaiBuddhistDate класс

Вы можете использовать java.time.chrono.ThaiBuddhistDate чтобы это сделать, см. следующий пример:

public static void main(String[] args) throws ParseException {
    ThaiBuddhistDate tbd = ThaiBuddhistDate.now(ZoneId.systemDefault());
    System.out.println(tbd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}

Вывод, который я получаю в своей системе,

2562-10-24

Большая часть функций java.time перенесена обратно на Java 6 и Java 7 в < strong>ThreeTen-Backport. Дальнейшая адаптация для более ранней версии Android (‹26) в ThreeTenABP< /а>. См. Как использовать ThreeTenABP….

person deHaar    schedule 24.10.2019
comment
@SudipPodder Да, см. этот вопрос. Вы в основном должны использовать библиотеку поддержки, и этот вопрос о том, как использовать ее в Android. - person deHaar; 24.10.2019
comment
Определенно даст шанс. Если это сработает, ваш ответ будет отмечен как принятый. Вы можете отредактировать свой ответ и добавить ссылку на комментарий, а также поддержку уровня API ‹ 26. - person Sudip Podder; 24.10.2019
comment
@BasilBourque OP сделал это, и я удалил тег Android, потому что думал, что речь идет только о java.time. Я бы не удалил этот тег, если бы можно было написать более 5 тегов под вопросом. - person deHaar; 24.10.2019
comment
Я добавил упоминание об Android в начале вопроса. - person Basil Bourque; 24.10.2019
comment
@BasilBourque Спасибо, OP заменил тег даты на Android. - person deHaar; 24.10.2019
comment
@SudipPodder Если у вас нет лет до 1941 года (по григорианскому стилю), это решение (основанное на ThreetenABP) будет работать нормально. - person Meno Hochschild; 24.10.2019
comment
@deHaar, сталкиваюсь с проблемой, если шаблон форматирования содержит значение ЧЧ: мм: сс. Похоже, формат ЧЧ:мм:сс не поддерживается в ThaiBuddhistDate. Есть идеи, как с этим справиться? - person Sudip Podder; 28.10.2019
comment
@SudipPodder этот класс содержит информацию только о дате. Возможно, получить дату и время из мгновения и использовать ChronoZonedDateTime<ThaiBuddhistDate>, но я не совсем уверен... Могут быть и другие варианты. - person deHaar; 28.10.2019

Поскольку вы уже используете java.util.Calendar и java.text.SimpleDateFormat.

Если вы можете изменить язык при создании экземпляра календаря, это должно работать:

val thaiCalendar = Calendar.getInstance(Locale("th", "TH"))
println(thaiCalendar.get(Calendar.YEAR)) // prints 2562

Но если вы просто хотите изменить формат, это сработало для меня:

val notThaiCalendar = Calendar.getInstance()
val thaiFormatter = SimpleDateFormat("yyyy-MM-dd", Locale("th", "TH"))
println(thaiFormatter.format(notThaiCalendar.time)) // prints 2562-10-24

ИЗМЕНИТЬ

Это решение не тестировалось на Android

person Diego Magdaleno    schedule 24.10.2019
comment
К вашему сведению, ужасно ошибочные классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими , замененный java.time классы, встроенные в Java 8 и более поздние версии. - person Basil Bourque; 24.10.2019
comment
Я знаю, но он использует эти классы в своем коде на методе adjustTimePattern - person Diego Magdaleno; 24.10.2019
comment
проверю @DiegoMagdaleno - person Sudip Podder; 24.10.2019
comment
Android (на большинстве мобильных платформ) имеет другую Calendar-реализацию, чем старая Java, особенно отсутствует буддийский календарь, поэтому этот ответ, вероятно, не сработает. - person Meno Hochschild; 24.10.2019
comment
@MenoHochschild, я действительно не тестировал его на Android. Я не знал, что есть такая разница. - person Diego Magdaleno; 24.10.2019
comment
@DiegoMagdaleno Хотя использование библиотеки, которая использовалась в вопросе, во многих случаях имеет смысл, этот спрашивающий также использует DateTimeFormatter и LocalDate из java.time, современный API даты и времени Java, поэтому в данном случае я думаю, что лучше использовать его, а не упомянутые старые и плохо спроектированные классы. - person Ole V.V.; 25.10.2019