在 Android 中使用泰国日历以特定格式解析日期
Parse date in specific format using Thai Calendar in 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 class 使用公历本身。
也尝试过使用 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 {
""
}
}
.
谁能帮我解决这个问题?
ThaiBuddhistDate
class
您可以使用 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 功能已向后移植到 ThreeTen-Backport project. Further adapted for earlier Android (<26) in ThreeTenABP. See 中的 Java 6 和 Java 7。
因为您已经在使用 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
上测试
对于 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 class 使用公历本身。
也尝试过使用 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 {
""
}
}
.
谁能帮我解决这个问题?
ThaiBuddhistDate
class
您可以使用 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 功能已向后移植到 ThreeTen-Backport project. Further adapted for earlier Android (<26) in ThreeTenABP. See
因为您已经在使用 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
上测试