Java日期时间与时区格式化

5

我目前正在使用SimpleDateFormat根据格式yyyy-MM-dd HH:mm:ss创建日期时间值。以下是我的代码:

     Date date = new SimpleDateFormat("yy-M-d H:m:ss").parse(datetime);
     String Dtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);

然而,我希望格式改为这样:
  2013-04-12T13:38:48+02:00

如何添加时区以获得所需的格式?

谢谢!


请参考以下链接,获取Java中当前时区的日期和时间:https://dev59.com/lnM_5IYBdhLWcg3wmkeu - user112233
6个回答

12
请查看SimpleDateFormat的API文档,您可以在那里看到,您可以使用字符'z'来获取时区信息。
例如:"yyyy.MM.dd G 'at' HH:mm:ss z"将给出"2001.07.04 AD at 12:08:56 PDT"。
要设置日期的时区,请参见此问题和答案

2
谢谢!但是z在最后添加了+0200。有没有办法变成"+02:00"?我需要时区中的冒号。 - diego10
1
@diego10 - FYI - ISO8601格式的:T都可以省略,这两种形式都是合法的。所以假设你想要这种格式来与其他东西进行交换 - 你应该不用担心。不过,如果你想要更优秀的日期处理方式,还可以考虑一下Joda Time - Matt Johnson-Pint

4
这是XML/XSD dateTime数据类型格式。使用javax.xml.datatype.XMLGregorianCalendar。
    XMLGregorianCalendar gc = DatatypeFactory.newInstance().newXMLGregorianCalendar("2013-04-12T13:38:48+02:00");
    System.out.println(gc);

输出

2013-04-12T13:38:48+02:00

1
这就是它。顺便说一下,您可以使用toGregorianCalendar.getTime来获取java.util.Date。 - Chris Kong

2
如果您使用“z”或“Z”,那么仍然无法确定您的时区将会是什么样子,这取决于您的本地设置和JVM版本,将选择哪个ISO8601版本。
为了始终以“+02:00”的格式获取时区,一种方法是请求它。请使用以下日期格式:
DateTimeFormatter formatter = 
    new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
        .appendOffset("+HH:MM","+00:00")
        .toFormatter();

始终使用ZonedDateTime类型。它是线程安全的。


1
我一直在寻找完全相同的答案。 我必须向后兼容现有的日期格式,就像示例中的格式一样 -“2013-04-12T13:38:48 + 02:00”,而我的另一个限制是我不能使用除Java 6提供的库之外的任何开源库。 因此,在这里没有找到解决方案后,我想出了这个简单的转换技术,它相当丑陋,但我想在这里发布它,以防有人需要快速而肮脏的解决方案。 如果有人知道如何更好地做到这一点(满足我提到的限制),请纠正我。
因此,要以所需格式生成输出:
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public GregorianCalendar stringToCalendar(String v) 
{
    // 22 is an idx of last ':', you can replace with v.lastIndex(':') to be neat  
    String simpleV = v.substring(0, 22).concat(v.substring(23));   

    GregorianCalendar gc = (GregorianCalendar) df.getCalendar();

    gc.setTime(df.parse(simpleV));
    return gc;
}

public String calendarToString(GregorianCalendar v) 
{
    df.setCalendar(v); 

    String out = df.format(v.getTime());

    return out.substring(0, 22).concat(":").concat(out.substring(22)); // read above on '22'
}   

就像我说的那样,这还远非完美,但我没有找到更好的选择。


我知道这是一个古老的问题报告,但如果有人想知道如何在格式本身中完成此操作,只需使用ZZ而不是Z。使用Z会以+XXXX格式显示,而ZZ将以+XX:XX格式显示。 - Deepak G M

0

有一个简单的方法可以做到。您可以定义您的格式,如下所示:

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

这样就可以了。


-1
你可以通过使用 java.util.Calendar 包轻松实现它。
尝试以下代码。
       import java.util.Calendar; //Import package

        String month_order[]={"Select...","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
        Calendar cal = Calendar.getInstance();
        int month = cal.get(Calendar.MONTH) + 1;
        int dom = cal.get(Calendar.DAY_OF_MONTH);
        int doy=cal.get(Calendar.YEAR);
        System.out.println("Current date: "+month_order[month]);
        System.out.println("Current Month:  "+dom);
        System.out.println("Current year: "+doy);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接