gpt4 book ai didi

android - 无法从本地日期转换为伦敦日期对象

转载 作者:行者123 更新时间:2023-12-02 13:10:56 25 4
gpt4 key购买 nike

Android Studio 4.0,Java 6。
我的格林尼治标准时间是格林尼治标准时间+ 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

如您所见,当地日期是 周二6月16日13:14:59 GMT + 03:00 2020
和成功将伦敦日期转换为String-> dateLondonAsString = 2020-06-16T11:14:59.000Z

真好
但是我需要将String转换为London Date。而且我使用方法 getDateFromString ,结果不正确:

date伦敦=周二6月16日13:14:59 GMT + 03:00 2020

正确的伦敦日期必须为: 周二6月16日11:14:59 GMT + 03:00 2020

为什么 getDateFromString不正确地将字符串转换为日期?

最佳答案

java.time和ThreeTenABP

要获取具有特定时区的日期时间对象,请转到java.time(现代的Java日期和时间API)。我正在编写Java代码,这是我所能做的,并且我相信您可以翻译:

    ZoneId london = ZoneId.of("Europe/London");

Date date = getOldfashionedDateFromSomewhere();
System.out.println("Original Date: " + date);

ZonedDateTime dateTimeLondon = date.toInstant().atZone(london);
System.out.println("Date-time in London: " + dateTimeLondon);

输出示例:

Original Date: Tue Jun 16 13:14:59 GMT+03:00 2020
Date-time in London: 2020-06-16T11:14:59+01:00[Europe/London]


由于没有时区,因此没有 Date。是的,我知道,当您打印它时,隐式调用其 toString方法,它会打印一个时区。发生的情况是,它捕获了JVM的默认时区,并使用它来呈现字符串。因此,只要您的JVM时区设置为GMT + 03:00,所有 Date对象都将始终打印该时区。

So if (in some another project) I need date with time zone the better way is use java.time.ZonedDateTime (java 8) ?



至少这是我推荐的方式。如我所说,使用 Date不是一种方法。一些方法是:
  • 可怜的老式方法:使用GregorianCalendar
  • 更好的方法:使用Joda-Time中的DateTime。如果接受外部依赖,我更喜欢ThreeTenABP。
  • 好的方法:来自java.time的ZonedDateTime
  • 高级方式:使用Time4J。我没有经验,所以我不建议您赞成或反对。如果您的项目的要求超出了java.time所提供的要求,那么我一定会研究此选项。

  • 您的代码出了什么问题

    首先,您可能不应该将时区设置为GMT + 03:00。虽然您所在的时区现在使用此GMT偏移量,但这并不意味着它总是具有或将始终具有。为了获得正确的历史和 future 日期结果,请使用实时区ID,例如非洲/内罗毕或欧洲/莫斯科,即采用地区/城市格式。就像您在英国时间使用 Europe/London一样(幸运的是,不是 GMT+00:00)。

    我已经提到了第二点:您不能在带有时区的日期和时间上使用 Date,因为 Date没有时区。 Date是一个时间点,不多也不少。

    接下来, 2020-06-16T11:14:59.000Z在伦敦的时间是错误的。 11:14:59在一天中的某个时间正确。 Z表示UTC或与UTC的偏移量为0,并且错误,因为英国使用夏令时(DST),因此6月的偏移量为+01:00(正如我上面代码的输出所示)。偏移 Z的时间为10:14:59。换句话说,您的时间减少了1个小时。 Z的此定义是ISO 8601标准的一部分。您的JSON格式为ISO 8601格式。我在底部包含一个链接。由于 Z是一个偏移量,因此您应始终对其进行格式设置和解析,并且切勿将其硬编码为格式模式字符串中的文字。

    从字符串转换为 Date时会显示相同的错误,因此可以平衡转换为 String时的错误,从而成功获取了等效的 Date对象。

    这是旧的Android项目。而且我不能使用java.time。我只能使用java.util.Date

    对于旧的Android版本,您当然也可以在旧的Android项目中使用java.time。
  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的Backport(JSR 310的ThreeTen;请参见底部的链接)。
  • On(旧)Android使用ThreeTen Backport的Android版本。称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

  • 链接
  • Oracle tutorial: Date Time解释如何使用java.time。
  • Java Specification Request (JSR) 310,首先描述java.time
  • ThreeTen Backport project,是java.time向Java 6和7(JSR-310的ThreeTen)的反向端口。
  • ThreeTenABP,Android版本的ThreeTen Backport
  • Question: How to use ThreeTenABP in Android Project,具有非常详尽的说明。
  • Wikipedia article: ISO 8601
  • Jon Skeet的编码博客上的
  • All about java.util.Date
  • 有关获取带有时区的Date的相关问题:TimeZone problem in Java
  • Joda-Time
  • Time4J - Advanced Date, Time, Zone and Interval Library for Java
  • 关于android - 无法从本地日期转换为伦敦日期对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62406205/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com