如何将一个时区的区域设置时间保留为所有时区的时间?

时间:2017-01-20 15:49:15

标签: java android

目前,我的应用中的日期存储为ISO日期2016-08-26T11:03:39.000+01:00

如果用户在英国的11:03:39参加了一个活动,那么这次在美国佛罗里达州以06:03:39显示是没有意义的。目前正在我的应用中发生这种情况。

无论事件发生在何处以及用户在哪里,如何将ISO日期转换回本地事件发生的时间?

以下是我目前正在使用的代码。

DateFormat isoDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy");
DateFormat timeFormat = new SimpleDateFormat("hh:mm a");
mDate = isoDateFormat.parse(isoDateString);
dateString = dateFormat.format(mDate);
timeString = timeFormat.format(mDate);

1 个答案:

答案 0 :(得分:1)

您可以通过从ISO字符串获取偏移量并从中获取时区来实现此目的。

import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.TimeZone;
import java.util.Date;

class Main {
  public static void main(String[] args) {
    DateFormat isoDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    //DateFormat isoDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); I needed to use XXX in repl.
    DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy");
    DateFormat timeFormat = new SimpleDateFormat("hh:mm a");
    try
    {
      String isoString = "2016-08-26T11:03:39.000+01:00";
      Date mDate = isoDateFormat.parse(isoString);
      System.out.println("GMT" + isoString.substring(23));
      TimeZone mTimeZone = TimeZone.getTimeZone("GMT" + isoString.substring(23));
      dateFormat.setTimeZone(mTimeZone);
      timeFormat.setTimeZone(mTimeZone);
      System.out.println(mTimeZone.toString());
      String dateString = dateFormat.format(mDate);
      String timeString = timeFormat.format(mDate);
      System.out.println(dateString + " " + timeString);
    }
    catch(ParseException e)
    {
       System.out.println("Error");
    }
  }
}

这是一个可以用来玩它的repl链接。

https://repl.it/FPrN/2