将EST中的字符串转换为PST中的日期

时间:2017-04-18 13:40:33

标签: java date

我尝试了以下方法并在Web中搜索以找到解决方案,但没有运气:寻找将IST中的字符串转换为PST的解决方案:

String string = new Date().toString();
        System.out.println(string);
        SimpleDateFormat dt = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
        dt.setTimeZone(TimeZone.getTimeZone("PST"));
        Date D = dt.parse(string);
        System.out.println(""+ D);

即使我将时区设为PST,我也会看到IST 这是出局:

Tue Apr 18 18:58:09 IST 2017 4月18日星期二18:58:09 IST 2017

我在这里尝试了另一个选项我看到它甚至在PST中显示时间但我看到下面的输出它有点令人困惑:

public static Date convertFromOneTimeZoneToOhter(Date dt,String from,String to ) {

          TimeZone fromTimezone =TimeZone.getTimeZone(from);//get Timezone object
          TimeZone toTimezone=TimeZone.getTimeZone(to);

          long fromOffset = fromTimezone.getOffset(dt.getTime());//get offset
          long toOffset = toTimezone.getOffset(dt.getTime());

          //calculate offset difference and calculate the actual time
          long convertedTime = dt.getTime() - (fromOffset - toOffset);
          Date d2 = new Date(convertedTime);

          return d2;
    }

OUT PUT: 转换日期:星期二4月18日06:28:09 IST 2017

有人可以帮忙解决这个问题:我找到了许多将IST日期时间转换为PST字符串而非IST / EST日期转换为PST日期的解决方案。 正如我上面提到的,我们可以格式化为String,但我正在寻找转换回Date

的示例

2 个答案:

答案 0 :(得分:3)

您应该查看Java 8的直接处理时区的新Date API

// Get the current date and time
      ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
      System.out.println("date1: " + date1);

      ZonedDateTime zonedDateTime = ZonedDateTime.now();
      System.out.println("Zoned Date Time: " + zonedDateTime);

      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + id);

      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("CurrentZone: " + currentZone);

打印:

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
Zoned Date Time: 2017-04-18T09:52:09.045-04:00[America/New_York]
ZoneId: Europe/Paris
CurrentZone: America/New_York

答案 1 :(得分:2)

由于这里的一些读者将使用Java 8或更高版本以及某些Java 7或更早版本,我将同时使用它们。

如果可以的话,我建议您使用Java 8中引入的java.time类:

    ZoneId targetTz = ZoneId.of("America/Los_Angeles");

    String string = "Tue Apr 18 18:58:09 +0300 2017";
    DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss ZZZ uuuu",
            Locale.ENGLISH);
    ZonedDateTime sourceTime = ZonedDateTime.parse(string, format);
    ZonedDateTime targetTime = sourceTime.withZoneSameInstant(targetTz);
    String result = targetTime.format(format);
    System.out.println(result);

打印:

Tue Apr 18 08:58:09 -0700 2017

你说你想要一个PST日期,这正是ZonedDateTime给你的:时区信息的日期和时间。

在示例中,我在字符串中给出了区域偏移+0300(对应于以色列日光时间)。我明白你如何给出时区并不重要。我想避免像IST这样的三个和四个字母的时区缩写。 IST不仅意味着爱尔兰标准时间,以色列标准时间或印度标准时间。我还注意到java.time课程时间为18:58:09 IST为18:58:09 IDT(UTC + 3)因为它知道以色列是在4月18日的DST;我返回到下面的SimpleDateFormat更加字面上IST,并将18:58:09 IST解释为18:58:09 +0200,这是1小时后的UTC。

如果需要,可以将java.time类与Java 1.7一起使用。您可以在the ThreeTen Backport中获取它们。

如果您不想使用java.time,那么使用Java 1.0和1.1中过时的类的方法在这种情况下没有那么不同,只有我不能给你你要求的PST日期:

    TimeZone targetTz = TimeZone.getTimeZone("America/Los_Angeles");
    String string = "Tue Apr 18 18:58:09 +0300 2017";
    SimpleDateFormat dt = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.ENGLISH);
    Date d = dt.parse(string);
    dt.setTimeZone(targetTz);
    String result = dt.format(d);
    System.out.println(result);

它打印与上面相同的结果。但是,您注意到只有一个Date对象。 Date对象无法保留任何时区信息,因此如果您需要此信息,则必须将targetTz对象与d一起使用。这是一个常见的误解,即Date对象中应该有一个时区,其toString()打印一个时区可能会有很大的帮助。这始终是JVM的默认时区,但并非来自Date对象。