繁体   English   中英

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

[英]Convert String in EST to Date in PST

我尝试了以下方法,并在Web上搜索以找到解决方案,但是没有运气:寻找将IST中的String转换为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的输出是这里的输出:

IST 2017年4月18日18:58:09星期二IST 2017年2月18日星期二

我在这里尝试了另一个选项,我看到它甚至显示了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;
    }

输出:转换日期:2017年4月18日星期二06:28:09

有人可以帮忙吗:我发现了很多将IST日期时间转换为PST字符串而不是IST / EST日期转换为PST日期的解决方案。 正如我上面提到的,我们可以格式化为字符串,但是我正在寻找一个转换回日期的示例

您应该研究Java 8的新Date API,该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

由于这里的一些读者将使用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转换为IDT 18:58:09 IDT(UTC + 3),因为它知道以色列4月18日在DST。 我返回到下面的SimpleDateFormat更直接地将IST转换为IST并将18:58:09 IST解释为18:58:09 +0200,这是在UTC之后的1小时。

如果需要,可以将java.time类与Java 1.7一起使用。 您可以在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对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM