[英]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偏移量。 我们知道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;
}
这对我有用。 修改需要的区域。
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);
}
切勿使用CST
, IST
和EST
等媒体中常见的3-4个字母的缩写。 这些不是真实的时区 ,不是标准化的,甚至不是唯一的(!)。
continent/region
相反,请确定您想要的真实时区。 时区以continent/region
格式命名 ,例如America/Montreal
和Africa/Casablanca
和Pacific/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.