【问题标题】:converting date timezone format in java在java中转换日期时区格式
【发布时间】:2016-02-04 06:15:01
【问题描述】:

编写了以下代码,用于尝试从双引号中的值转换日期时间,但由于解析异常而失败。请指教

public static void main(String args[]) {
    try {

        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S Z");
        Date date = format.parse("2016-02-03 10:39:29.099545 -8:00");
    } catch (ParseException pe) {
        // TODO: Add catch code
        pe.printStackTrace();
    }
}

由于解析异常而失败。

此外,我的最终输出应如下所示: 2016-01-26T12:07:41-08:00

【问题讨论】:

    标签: java date datetime


    【解决方案1】:

    时区的表示与字符串“-8:00”不对应。您可以使用三种类型的时区表示:

    1. X(ISO 8601 时区):
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S XXX");
    Date date = format.parse("2016-02-03 10:39:29.099545 -08:00");
    
    1. Z(RFC 822 时区):
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S Z");
    Date date = format.parse("2016-02-03 10:39:29.099545 -0800");
    
    1. z(常规):
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S zzz");
    Date date = format.parse("2016-02-03 10:39:29.099545 GMT-08:00");
    

    查看SimpleDateFormat 文档

    要将日期转换为您想要的字符串,请使用以下格式:

    DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    String str = format2.format(date);
    

    但对于 ISO 8601 时区标准,请从 SimpleDateFormat 文档中考虑这一点:

    对于格式化,如果与 GMT 的偏移值为 0,则生成“Z”

    查看SimpleDateFormat ignores “XXX” if timezone is set to “UTC”

    【讨论】:

    • 我的服务器返回 2016-02-04 08:19:11.778892-8:00
    【解决方案2】:

    要将日期格式化为ISO 8601,您可以使用下面的 sn-p。

    // pre Java 8
    TimeZone timeZone = TimeZone.getTimeZone("PST");
    GregorianCalendar cal = new GregorianCalendar(timeZone);
    cal.set(2016, 1, 26, 12, 7, 41);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    sdf.setTimeZone(timeZone);
    System.out.println(sdf.format(cal.getTime())); 
    

    SimpleDateFormat的格式化规则。

    // Java 8
    LocalDateTime dateTime = LocalDateTime.of(2016, 1, 26, 12, 7, 41);
    ZonedDateTime of = ZonedDateTime.of(dateTime, ZoneId.of("-0800"));
    DateTimeFormatter pattern = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
    String format = pattern.format(of);
    System.out.println(format);
    

    DateTimeFormatter 的 Javadoc。


    两个 sn-ps 的输出

    2016-02-26T12:07:41-0800
    

    【讨论】:

    • 你在哪里设置输入值
    • @Vik “输入值”是什么意思?格式化的日期和时间分别设置为cal.set(...)LocaldateTime.of(...)
    • 时区 timeZone = TimeZone.getTimeZone("PST");对不起,我的意思是你为什么在这里硬编码 pst?
    • @Vik 我从您的示例-08:00 中得出它。仅将其视为要在其中转换日期/时间的任何其他时区的占位符。
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2017-08-15
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多