5

我正在尝试使用 GMT 解析表示日期的字符串,但它会在我的 PC(太平洋)上的时区打印出来。当我运行以下命令时,我得到以下输出。关于如何让解析解析并返回 GMT 日期的任何想法?如果您看下面,我正在使用 format.setTimeZone(TimeZone.getTimeZone("GMT")); 但它没有产生预期的结果。

以下代码的输出:

2012 年 10 月 29 日星期一 05:57:00 PDT

 package javaapplication1;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.TimeZone;


    public class JavaApplication1 {

        public static void main(String[] args) throws ParseException {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
            format.setTimeZone(TimeZone.getTimeZone("GMT"));
            System.out.println(format.parse("2012-10-29T12:57:00-0000"));
        }
    }
4

5 回答 5

8

您正在使用format.setTimeZone(TimeZone.getTimeZone("GMT"));格式化程序,该格式化程序用于将字符串格式化为日期,即

      Date date = format.parse("2012-10-29T12:57:00-0000");

被解析处理2012-10-29T12:57:00-0000是一个GMT值,但是您正在打印date,它在打印中使用本地时区,因此您注意到了差异。

如果您想在 中打印日期GMT,请使用:

    String formattedDate = format.format(date);

并打印formattedDate. 这将是GMT

    System.out.println(formattedDate);
于 2012-10-31T20:16:10.520 回答
0

完整的工作示例

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main
{
    public static void main(String[] args)
    {
        final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss z", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(sdf.format(new Date())); 
        // ^^^ note printing the results of sdf.format() 
        //     not a raw `Date`
    }
}

结果:31-10-2012 08:32:01 UTC 注意我实际打印的内容!

于 2012-10-31T20:11:38.030 回答
0
System.out.println(format.parse("2012-10-29T12:57:00-0000"));

将日期解析为 GMT 并返回一个 Date 对象。然后将其打印出来(使用默认的 toString() 方法)。这仅使用您计算机的设置。所以你应该使用:

Date parsedDate=format.parse("2012-10-29T12:57:00-0000");
System.out.println(format.format(parsedDate));
于 2012-10-31T20:14:39.603 回答
0

试试这个,

public static String converterGMTToLocal(String datahora_gmt)
{
    try {
        SimpleDateFormat fmt = new SimpleDateFormat("YYYY-MM-dd HH:mm");
        Calendar cal = Calendar.getInstance();
        cal.setTime(fmt.parse(datahora_gmt));
        cal.add(Calendar.HOUR, -3);

        return fmt.format(cal.getTime());

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return e.getMessage();
    }
}

更改项目的值...进行适当的更改

于 2015-09-25T16:24:59.843 回答
0

java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。我更喜欢使用以下格式化程序进行解析。

private static final DateTimeFormatter PARSER = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
        .appendPattern("xx")
        .toFormatter(Locale.ROOT);

解析为 anOffsetDateTime以保留字符串 ( -0000) 的偏移量。

    String gmtString = "2012-10-29T12:57:00-0000";
    OffsetDateTime gmtDateTime = OffsetDateTime.parse(gmtString, PARSER);
    System.out.println(gmtDateTime);

输出是:

2012-10-29T12:57Z

输出中的尾随Z表示 UTC 或与 UTC 的偏移量 0,出于我们的目的,我们可以将其视为等同于 GMT。如果我们愿意,我们还可以在打印之前使用相同(或不同)的格式化程序重新格式化:

    System.out.println(gmtDateTime.format(PARSER));

2012-10-29T12:57:00+0000

在这种情况下,您可能希望将格式化程序命名为PARSER.

偏移量 -0000 不合法

我想知道你从哪里得到那个字符串,因为它遵循标准 ISO 8601 格式,除了 ISO 8601 不允许-0000作为偏移量。偏移量零必须以、Z+00:00给出。对我们来说幸运的是,Java 在这一点上是宽容的,并且接受为等价于.+0000+00-0000+0000

链接

于 2021-11-04T10:12:07.693 回答