在Java中创建新的Date对象时,时区自动更改

时间:2016-02-11 05:04:12

标签: java android datetime timezone

我的时间戳基于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 

请帮我解决这个问题。

4 个答案:

答案 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"));