将日期转换为格林尼治标准时间

时间:2019-06-26 12:25:25

标签: java java-date

我想将日期转换为格林尼治标准时间。

我在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

我不确定为什么会这样吗? 怎么了?

1 个答案:

答案 0 :(得分:2)

java.time

您说过您不能使用现代的日期和时间API,但是对于其他读者,我想首先介绍一下该选项。 SimpleDateFormatDate的设计欠佳,而且已经过时,尤其是前者特别麻烦,因此,我建议避免使用它们。

我假设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。