这是我面临的问题-
首先,我创建了一个日期对象,它将为我提供设备时区的当前日期和时间,即
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”,但是还是没有运气。
如果您有任何想法要阅读,请告诉我。
答案 0 :(得分:1)
两条消息:
Date
没有时区,它没有时区。因此,无论您如何编写代码,都无法使用Date
和SimpleDateFormat
来获取想要的内容。Date
,SimpleDateFormat
和TimeZone
早已过时且设计不良。他们的现代替代产品是java.time,2014年引入的日期和时间API。现代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
java.time
吗?是的,java.time
在较新的Android设备上都能很好地工作。它只需要至少 Java 6 。
org.threeten.bp
和子包中导入日期和时间类。java.time
。答案 1 :(得分:0)
请尝试调试来自的值 “ loadPreferences(Utility.TIMEZONE_NAME)”,并确保它与“美国/夏威夷”相同
也尝试使用此工具进行调试-
sdf.setTimeZone(TimeZone.getTimeZone("US/Hawaii"));