繁体   English   中英

在Java 8中将日期转换为EST

[英]Converting date to EST in java 8

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

PMST,NST,AST,EST,CST,MST,PST,AKST,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

因此,您知道您输入的“本地日期”在PMST时区中。

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

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

但是我们现在所拥有的只是一个String ,因此首先我们必须确定将要使用的日期时间格式,并且必须知道TimeZone,

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

在此, Z代表TimeZone偏移量。 我们知道PMSTUTC-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;
}

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

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);
    }

避免伪区域

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

真实时区: continent/region

相反,请确定您想要的真实时区。 时区continent/region格式命名 ,例如America/MontrealAfrica/CasablancaPacific/Auckland

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

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

由于您的输入缺少从UTC偏移或时区的指示符,因此解析为LocalDateTime

LocalDateTime ldt = LocalDateTime.parse( input ) ;

如果确定要用于此输入,请应用一个时区。

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

暂无
暂无

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

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