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



我有基于 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"));

相关内容

  • 没有找到相关文章

最新更新