我有基于 IST(印度标准时间/GMT + 5:30 小时)的时间戳,我的应用程序根据设备时间戳显示上次活动时间。即当前时间 - 活动时间戳。当设备时区为 IST 时,它很好。
例如
Activity timestamp - 11/Feb/2016 09:00:00 AM
Current timestamp (IST) - 11/Feb/2016 10:00:00 AM
My Calculation = Current timestamp - Activity timestamp
So Application shows 1 hr ago
但是设备时区在同一时间更改为其他时区,例如PHT(菲律宾时间/GMT + 8小时)
Activity timestamp - 11/Feb/2016 09:00:00 AM
Current timestamp(PHT) - 11/Feb/2016 12:30:00 AM (plus 2:30Hrs compare with IST)
My Calculation = Current timestamp - Activity timestamp
So Application shows 3 hrs 30 mis ago
我的问题是,如何始终使用 java 获取 IST 时间? 无论时区如何,我都需要 IST 时间。
我尝试了下面的代码,当我将值更改为 IST 但时区自动更改为设备时区时。
请参考下面的网址获取源代码 http://goo.gl/dnvQF5
SimpleDateFormat sd = new SimpleDateFormat(
"yyyy.MM.dd G 'at' HH:mm:ss z");
Date date = new Date();
// TODO: Avoid using the abbreviations when fetching time zones.
// Use the full Olson zone ID instead.
sd.setTimeZone(TimeZone.getTimeZone("GMT"));
String gmtDate = sd.format(date);
System.out.println("GMT --> " + gmtDate);
String istDate = gmtDate.replace("GMT", "IST");
System.out.println("After Replace -> " + istDate);
sd.setTimeZone(TimeZone.getTimeZone("IST"));
try {
Date istConvertedDate = sd.parse(gmtDate);
System.out.println("After Convert --> " + istConvertedDate);
} catch (ParseException ex) {
ex.printStackTrace();
}
我得到了这样的输出
GMT --> 2016.02.11 AD at 05:20:07 GMT
After Replace -> 2016.02.11 AD at 05:20:07 IST
After Convert --> Thu Feb 11 00:20:07 EST 2016
请帮助我解决这个问题。
类java.util.Date
只是自 UNIX 纪元 (1970-01-01T00:00:00Z) 以来经过的毫秒的薄包装器。此类型的对象不携带任何格式或时区信息。因此,在使用SimpleDateFormat
解析具有时区标识符或名称的文本后,每个此类对象都完全丢失了时区信息。
您观察到并感到困惑的是,此类的方法toString()
使用基于系统时区的特定表示形式。
另一件事:如果您应用字符串操作将"GMT"替换为"IST"(一个矛盾的时区名称 - 以色列?印度?爱尔兰?然后,您可以有效地更改时刻/时刻,同时保持本地时间表示。你真的想要这个吗?
如果你想保留最初解析的时区信息,那么你可以使用库中的ZonedDateTime
Threeten-ABP 或DateTime
库中的 Joda-Time-Android 或ZonalDateTime
在我的库 Time4A 中。
试试
public static void main(String[] args) {
SimpleDateFormat sd = new SimpleDateFormat(
"yyyy.MM.dd G 'at' HH:mm:ss z");
Date date = new Date();
// TODO: Avoid using the abbreviations when fetching time zones.
// Use the full Olson zone ID instead.
sd.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sd.format(date));
String gmtDate = sd.format(date);
System.out.println(gmtDate);
//Here you create a new date object
Date istDate= new Date();
sd.setTimeZone(TimeZone.getTimeZone("IST"));
String istDate=sd.format(istDate);
System.out.println(istDate)
}
这样,第一个打印时间将是GMT,第二个将是ISD。
java.util.Calendar
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("IST"));
此日历包含 IST 时区中的当前时间。
您可以设置时间戳:
calendar.setTimeInMillis(timeStamp);
并获取java.util.Date或时间戳
Date date = calendar.getTime();
Long timeStamp = calendar.getTimeInMillis();
替换
sd.setTimeZone(TimeZone.getTimeZone("IST"));
自
TimeZone.setDefault(TimeZone.getTimeZone("IST"));