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

如果用户在英国时间11:03:39参加了某个 Activity ,那么这次在美国佛罗里达州显示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);

最佳答案

您可以通过从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

09-10 06:30
查看更多