【问题标题】:Converting date to EST in java 8在 java 8 中将日期转换为 EST
【发布时间】:2017-12-26 06:54:01
【问题描述】:

我正在尝试将日期转换为以下时区,但结果不符合预期 - 我得到的要求是例如从 PMST 转换为 EST 输出应该减少 2 小时。

PMST, 新标准时间, AST, 美东时间, 科技委, MST, 太平洋标准时间, 知识与知识, HAST

String inputDate = "2017/04/30 08:10";
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
LocalDateTime local = LocalDateTime.parse(inputDate, sourceFormatter);
ZonedDateTime zoned = local.atZone(TimeZone.getTimeZone("PMST").toZoneId());
ZonedDateTime requiredZone = zoned.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId());
System.out.println(requiredZone);

输出 - 2017-04-30T03:10-05:00

【问题讨论】:

  • 如 Sarvesh 所述,ZoneId 中没有提到时区 PMST,因此您必须明确提及。您可以在 ZoneId.java 中查看支持的 zoneId
  • 识别或更正您的PMST

标签: java


【解决方案1】:

避免伪区

切勿使用媒体中常见的 3-4 个字母缩写,例如 CSTISTEST。这些不是真正的时区,没有标准化,甚至不是唯一的(!)。

真实时区:continent/region

相反,请确定您想要的真实时区。 Time zones have names 格式为 continent/region,例如 America/MontrealAfrica/CasablancaPacific/Auckland

更改您的输入以符合 ISO 8601 标准格式。

String input = "2017/04/30 08:10".replace( " " , "T" ) ;

解析为 LocalDateTime,因为您的输入缺少与 UTC 或时区偏移的指示符。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

如果您确定该时区是为此输入而设计的,请应用时区。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.withZoneSameInstant( z ) ;

【讨论】:

    【解决方案2】:

    所以你知道你输入的“本地日期”是在 PMST 时区。

    String localDateTimeString = "2017/04/30 08:10";
    

    但是你应该能够注意到上面没有携带你知道的时区信息。所以你需要将该信息添加到字符串中。

    但我们现在拥有的只是一个String,所以首先我们必须决定我们将使用的日期时间格式,并且它必须是 TimeZone 感知的,

    DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm Z");
    

    这里,Z 代表时区偏移量。我们知道PMST就是UTC-0300,所以我们需要把这个信息添加到我们的本地时间字符串中,

    String dateTimeString = "2017/04/30 08:10" + " -0300";
    

    现在,我们可以使用我们的日期时间格式化程序来读取它,

    ZonedDateTime dateTimeInPMST = ZonedDateTime.parse(dateTimeString, dateTimeWithZoneFormatter);
    

    而且,现在我们可以在任何我们想要的时区获取日期,

    ZonedDateTime dateTimeInEST = dateTimeInPMST.withZoneSameInstant(TimeZone.getTimeZone("EST").toZoneId());
    

    编辑 1 ::

    获取时区的偏移量(比如说EST

    int offsetInSeconds = TimeZone.getTimeZone("EST").getRawOffset() / 1000;
    
    ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offsetInSeconds);
    
    String zoneOffsetString = zoneOffset.toString();
    // "-05:30"
    

    请注意 -05:30 中的 :,我们将不得不更改 DateTimeFormat 以适应此情况,

    DateTimeFormatter dateTimeWithZoneFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm ZZZ");
    

    现在,您可以将它添加到任何 dateTimeString,

    public String makeOffsetAwareDateTimeString(String dateTimeString, String timezone) {
        int offsetInSeconds = TimeZone.getTimeZone(timezone).getRawOffset() / 1000;
        ZoneOffset zoneOffset = ZoneOffset.ofTotalSeconds(offsetInSeconds);
        String zoneOffsetString = zoneOffset.toString();
        return dateTimeString + " " + zoneOffsetString;
    }
    

    【讨论】:

    • 谢谢 :) sarvesh,你能告诉我如何获取其他 zoneId 的时区偏移量,例如 PMST 是 UTC-0300
    • 添加了从时区偏移的方法。
    【解决方案3】:

    这对我有用。修改需要哪个区域。

    public class ZonedDateTime {
    
        private static final String DATE_FORMAT = "dd/M/yyyy hh:mm:ss a";
    
        public static void main(String[] args) {
    
            String dateInString = "26/12/2017 10:15:55 AM";
            LocalDateTime ldt = LocalDateTime.parse(dateInString, DateTimeFormatter.ofPattern(DATE_FORMAT));
    
            ZoneId newYokZoneId = ZoneId.of("America/New_York");
            ZonedDateTime nyDateTime =ldt.atZone(newYokZoneId);
            System.out.println("Date (New York) : " + nyDateTime);
    
            DateTimeFormatter format = DateTimeFormatter.ofPattern(DATE_FORMAT);
            System.out.println("Date (New York) : " + format.format(nyDateTime));
    
        }
    
    }
    

    使用这个查找所有区域。

    TreeSet<String> sortedZones = new TreeSet<>(ZoneId.getAvailableZoneIds());
    
        for (String zone : sortedZones) {
                System.out.println(zone);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-07
      • 2016-01-10
      • 1970-01-01
      • 2014-06-10
      • 2014-01-24
      • 2021-06-04
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多