我的时间戳基于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
我的问题是,如何让IST时间总是使用java?无论时区如何,我都需要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
请帮我解决这个问题。
答案 0 :(得分:2)
类java.util.Date
只是自UNIX纪元(1970-01-01T00:00:00Z)以来经过的毫秒数的薄包装器。此类对象不携带任何格式或时区信息。因此,在使用SimpleDateFormat
解析带有时区标识符或名称的文本后,每个此类对象都完全丢失了时区信息。
您观察到并且感到困惑的是,此类的方法toString()
使用基于系统时区的特定表示。
另一件事:如果你应用字符串操作替换" GMT" by" IST" (一个矛盾的时区名称 - 以色列?印度?爱尔兰?)然后你在保持当地时间表示的同时有效地改变了时刻/瞬间。你真的想要这个吗?
如果您想保留最初解析的时区信息,那么您可以使用库Threeten-ABP中的ZonedDateTime
或库Joda-Time-Android中的DateTime
或{{1}我的图书馆Time4A。
答案 1 :(得分:1)
尝试
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。
答案 2 :(得分:0)
您可以使用java.util.Calendar
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("IST"));
此日历包含IST timeZone中的当前时间。
您可以设置timeStamp:
calendar.setTimeInMillis(timeStamp);
获取java.util.Date或时间戳
Date date = calendar.getTime();
Long timeStamp = calendar.getTimeInMillis();
答案 3 :(得分:0)
替换
sd.setTimeZone(TimeZone.getTimeZone("IST"));
到
TimeZone.setDefault(TimeZone.getTimeZone("IST"));