我想将日期转换为格林尼治标准时间。
我在BST中得到一个日期,我想将其转换为格林尼治标准时间而不进行时区转换。 例: **如果BST日期为:BST 2019年6月26日星期三13:30:13
我想将其转换为格林尼治标准时间2019年6月26日星期三13:30:13 **
我想忽略时区信息,并返回与格林尼治标准时间相同的日期。
为此,我正在尝试
private SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
private SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
private SimpleDateFormat dateFormatGmtText = new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss 'GMT'");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
String textDate = dateFormatLocal.format(date);
//Date is Wed June 26 13:30:13 BST 2019
private Date toGMTDate(final Date date) {
String textDate = dateFormatLocal.format(date);
try {
String[] dateParts = textDate.split("\\+");
textDate = dateParts[0] + "+0000";
return dateFormatGmt.parse(textDate);
} catch (ParseException e) {
return null;
}
}
private String toGMT(final Date date) {
return dateFormatGmtText.format(toGMTDate(date));
}
当我致电toGMT
时,它将返回Wed 26 Jun 2019 14:30:13 GMT
我不确定为什么会这样吗? 怎么了?
答案 0 :(得分:2)
您说过您不能使用现代的日期和时间API,但是对于其他读者,我想首先介绍一下该选项。 SimpleDateFormat
和Date
的设计欠佳,而且已经过时,尤其是前者特别麻烦,因此,我建议避免使用它们。
我假设BST是英国夏令时的时间(存在其他解释)。而且我假设您无法避免获得老式的Date
对象。
private static DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("EEE dd MMM yyyy HH:mm:ss z", Locale.UK);
private static ZoneId britain = ZoneId.of("Europe/London");
private static ZoneId gmt = ZoneId.of("Etc/GMT");
private static String toGMT(final Date date) {
ZonedDateTime britishTime = date.toInstant().atZone(britain);
ZonedDateTime gmtTime = britishTime.withZoneSameLocal(gmt);
return gmtTime.format(formatter);
}
与Date
的BST 2019年6月26日星期三13:30:13一起尝试:
String textDate = dateFormatLocal.format(date);
System.out.println(textDate);
System.out.println(toGMT(date));
输出为:
2019-06-26T13:30:13+0100 Wed 26 Jun 2019 13:30:13 GMT
每当您获得老式Date
时,要做的第一件事就是将其转换为Instant
。然后从那里进行任何进一步的转换。更改时区并保持日期和时间(时分秒)的关键是withZoneSameLocal
类的ZonedDateTime
方法。
我建议为格式化程序指定语言环境。
我不确定为什么会这样吗?怎么了?
没有Date
,因为没有时区。这是一个时间点,仅此而已。您的toGMTDate
方法返回一个小时后的时间点:您给它的时间是13:30:13 + 0100,并且它返回了13:30:13 + 0000,这是同一时间点如14:30:13 + 0100。接下来,您使用格式化程序对该时间点进行了格式化,该格式化程序使用了您的默认时区Europe / London,因此产生了14:30:13,但同时在字符串中打印了GMT
-您报告的结果。
…新的时间库,但由于某些原因,我无法使用它们。
如果您确实有一个邪恶的老板,要么强迫您使用Java 1.4或1.5,并且/或者禁止使用外部依赖项,那么很简单的技巧就是:
private String toGMT(final Date date) {
return dateFormatGmtText.format(date);
}
作弊是:您的dateFormatGmtText
使用默认时区,欧洲/伦敦,但撒谎并在格式化的字符串中打印GMT
。这将提供与上面相同的输出-您所要求的输出。与您的代码相比,我只是省略了日期转换。
链接: Oracle tutorial: Date Time解释了如何使用java.time。