Java Android-将GMT时间转换为语言环境时间

Java Android-将GMT时间转换为语言环境时间,java,android,datetime-format,Java,Android,Datetime Format,我正在尝试将UTC时间转换为用户的区域设置时间。但是,我会在UTC的同一时间回来。 显然,将时区设置为locale/default不起作用 另一种方法似乎可以使用Instant,但需要API级别26 这是我输入的字符串日期:“2020-01-16T19:44:48.303+0000”。 我希望日期和时间采用这种格式:“M/dd/yy-h:mm aa” 告诉解析日期格式化程序使用UTC时区进行解析,告诉格式化日期格式化程序使用默认时区进行格式化(不告诉它任何内容): 输出 输入:2020-01-1

我正在尝试将UTC时间转换为用户的区域设置时间。但是,我会在UTC的同一时间回来。 显然,将时区设置为locale/default不起作用

另一种方法似乎可以使用Instant,但需要API级别26

这是我输入的字符串日期:“2020-01-16T19:44:48.303+0000”。 我希望日期和时间采用这种格式:“M/dd/yy-h:mm aa”

告诉解析日期格式化程序使用UTC时区进行解析,告诉格式化日期格式化程序使用默认时区进行格式化(不告诉它任何内容):

输出

输入:2020-01-16T19:44:48.303+0000
输出:2020-01-16T14:44:48.303
东部标准时间-0500
java.time
Locale
与日期时间对象的内容无关。只有在生成表示日期时间对象值的文本时,区域设置才会出现在图片中。我怀疑您的意图是从UTC小时分秒的偏移量调整到特定地区(时区)的人们使用的挂钟时间

切勿使用
SimoleDateFormat
日期
日历
。这些糟糕的日期时间类在几年前被java.time取代。对于26岁之前的Android,将库添加到项目中

这是我在字符串中输入的日期:“2020-01-16T19:44:48.303+0000”

提示:如果在偏移量中包含小时和秒之间的冒号字符:
+00:00
,则java.time类和其他日期-时间框架工作得更好

如果所有输入具有相同的偏移量,请替换字符串的该部分

String input = "2020-01-16T19:44:48.303+0000".replace( "+0000" , "+00:00" ) ;
解析为
瞬间
,UTC中的瞬间

Instant instant = Instant.parse( input ) ;
生成所需格式的字符串。你真的想要一位数的月和两位数的日吗?一位数小时加两位数分钟

DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/dd/uu - h:mm a" ).withLocale( locale ) ;
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
String output = instant.atZone( z ).format( z ) ;
我建议您改为使用CalizedDateTime的
DateTimeFormatter.ofCalizedDateTime
让java.time自动本地化


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(没有“语言环境时间”之类的东西)例如, Loal.U.SCOD>覆盖了很多时区,太平洋、山峰、中东和东部是其中的4大类。作为一种选择,考虑扔掉那些过时的、臭名昭著的麻烦代码< SimpleDateFormat >代码>和朋友,并添加到Android项目中,以便使用Java.Times、现代java日期和时间API。使用起来非常好。您的基本错误是试图将日期和时间存储在字符串中。请将它们存储在适当的日期时间对象中,例如
      OffsetDateTime
      ,它是一个来自的类(不一定需要API级别26,请参阅我前面的注释)。然后,当您需要向用户显示时间时,将其转换为用户的时区(与区域设置不同),并将其格式转换为字符串(在适当的区域设置中)。@我在第2段的最后一句中提到了ThreeTenABP。我添加了粗体。我在底部添加了“About java.time”部分。
      Instant instant = Instant.parse( input ) ;
      
      DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/dd/uu - h:mm a" ).withLocale( locale ) ;
      ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
      String output = instant.atZone( z ).format( z ) ;