从设备获取当前时间毫秒,并将其转换为具有不同时区的新日期

时间:2018-09-24 08:35:05

标签: java android date time timezone

这是我面临的问题-

首先,我创建了一个日期对象,它将为我提供设备时区的当前日期和时间,即

Date date = new Date(); // Let say the time zone is India - GMT (+05:30)
The value of date is = "Mon Sep 24 13:54:06 GMT+05:30 2018"

不,我有一个Date格式化程序,通过它我转换了以下日期对象。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone(loadPreferences(Utility.TIMEZONE_NAME)));
// Here the timezone is Hawaii (GMT-10:00)

现在按照新时区(即夏威夷)获取时间

String dateS = sdf.format(date); 
// This will give you the date with new timezone - "2018/09/23 22:24:06 GMT-10:00"

现在将此字符串日期转换为日期对象为-

Date newDate = sdf.parse(dateS);

现在,我获得的新日期与我过去的时区不同。

The value of newDate which i'm getting is = "Mon Sep 24 13:54:06 GMT+05:30 2018" 
//This is device timezone not the one i have set.

我已经在日期格式化程序中尝试过“ Z”,“ z”,“ X”,“ ZZ”,“ ZZZZZ”,但是还是没有运气。

如果您有任何想法要阅读,请告诉我。

2 个答案:

答案 0 :(得分:1)

两条消息:

  • 您的期望是错误的。 Date没有时区,它没有时区。因此,无论您如何编写代码,都无法使用DateSimpleDateFormat来获取想要的内容。
  • DateSimpleDateFormatTimeZone早已过时且设计不良。他们的现代替代产品是java.time,2014年引入的日期和时间API。

ZonedDateTime

现代ZonedDateTime的名称为时区:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss z", Locale.US);
    ZonedDateTime nowInHawaii = ZonedDateTime.now(ZoneId.of("Pacific/Honolulu"));
    String dateS = nowInHawaii.format(formatter);
    System.out.println(dateS);

此代码段的输出为:

  

2018/09/24 18:43:19 HST

如果要在输出中使用偏移量,请更改格式器:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss OOOO", Locale.US);
  

2018/09/24 18:45:53 GMT-10:00

问题:我可以在Android上使用java.time吗?

是的,java.time在较新的Android设备上都能很好地工作。它只需要至少 Java 6

  • 在Java 8和更高版本以及新的Android设备上(我被告知API级别为26),内置了现代API。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen,首次描述了现代API)。
  • 在(较旧的)Android上,使用ThreeTen Backport的Android版本。叫做ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。

链接

答案 1 :(得分:0)

请尝试调试来自的值 “ loadPreferences(Utility.TIMEZONE_NAME)”,并确保它与“美国/夏威夷”相同

也尝试使用此工具进行调试-

sdf.setTimeZone(TimeZone.getTimeZone("US/Hawaii"));