【发布时间】:2020-10-05 22:14:13
【问题描述】:
Android Studio 4.0、Java 6。 我的 GMT 是 GMT + 03:00
defaultConfig {
minSdkVersion 17
targetSdkVersion 28
const val LONDON_TIME_ZONE_ID = "Europe/London"
const val DEFAULT_DATE_JSON_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.000'Z'"
fun fromDateToLondonDate(localDate : Date) : Date? {
val dateLondonAsString = fromDate2LondonDateAsString(localDate)
val timeZoneLondon : TimeZone = TimeZone.getTimeZone(LONDON_TIME_ZONE_ID)
val dateLondon = getDateFromString(dateLondonAsString, timeZoneLondon)
if (BuildConfig.DEBUG)
Log.d("", "fromDateToLondonDate:" +
"\nlocalDate = $localDate"+
"\ndateLondonAsString = $dateLondonAsString"+
"\ndateLondon = $dateLondon")
return dateLondon
}
fun fromDate2LondonDateAsString(date : Date) : String? {
val timeZoneLondon : TimeZone = TimeZone.getTimeZone(LONDON_TIME_ZONE_ID)
val formatter: DateFormat = SimpleDateFormat(DEFAULT_DATE_JSON_FORMAT)
formatter.setTimeZone(timeZoneLondon)
val dateAsString : String = formatter.format(date)
return dateAsString
}
fun getDateFromString(str: String?, tz: TimeZone?): Date? {
return try {
val sdf = SimpleDateFormat(DEFAULT_DATE_JSON_FORMAT);
sdf.setTimeZone(tz)
val date = sdf.parse(str)
return date
} catch (e: ParseException) {
//e.printStackTrace();
null
}
}
这里的结果:
fromDateToLondonDate:
localDate = Tue Jun 16 13:14:59 GMT+03:00 2020
dateLondonAsString = 2020-06-16T11:14:59.000Z
dateLondon = Tue Jun 16 13:14:59 GMT+03:00 2020
如您所见,当地时间是 Tue Jun 16 13:14:59 GMT+03:00 2020 并成功转换为伦敦日期作为字符串 -> dateLondonAsString = 2020-06-16T11:14:59.000Z
很好。 但我需要将字符串转换为伦敦日期。我使用 getDateFromString 方法,结果不正确:
dateLondon = 2020 年 6 月 16 日星期二 13:14:59 GMT+03:00
正确的伦敦日期必须是:Tue Jun 16 11:14:59 GMT+03:00 2020
为什么getDateFromString 不能正确从字符串转换为日期?
【问题讨论】:
-
我建议不要使用
java.util.Date,它已经过时了。其中之一是对偏移量和区域的麻烦处理。可以用java.time吗? -
@deHaar 这是旧的 Android 项目。而且我不能使用java.time。我只能使用 java.util.Date
-
好的,但是您可以导入 backport 以获得此功能...也请参阅 this question (How to use ThreeTenABP in Android)。
-
这是 Kotlin,不是 Java。
标签: android kotlin timezone java.util.date datetime-conversion