在Java中输出RFC 3339时间戳

Cri*_*ian 36 java timestamp rfc3339

我想输出一个PST偏移量的时间戳(例如,2008-11-13T13:23:30-08:00).java.util.SimpleDateFormat似乎没有以小时:分钟格式输出时区偏移,它排除冒号.有一种简单的方法可以在Java中获得时间戳吗?

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?
Run Code Online (Sandbox Code Playgroud)

另外,SimpleDateFormat无法正确解析上面的示例.它扔了一个ParseException.

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
Run Code Online (Sandbox Code Playgroud)

Dan*_*eck 41

从Java 7开始,有XISO8601时区的模式字符串.对于您描述的格式的字符串,请使用XXX.请参阅文档.

样品:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
        .format(new Date()));
Run Code Online (Sandbox Code Playgroud)

结果:

2014-03-31T14:11:29+02:00
Run Code Online (Sandbox Code Playgroud)


小智 16

看看Joda Time套餐.它们使RFC 3339的日期格式化变得更加容易.

乔达示例:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案实际上对一个例子很有用. (2认同)
  • @Biff你可以简化你的代码示例。不需要格式化程序。Joda-Time 自动默认为 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) / [RFC 3339](http://www.ietf.org/rfc/rfc3339.txt) 格式。只需显式或隐式调用“toString”方法即可。像这样,`String output = dt.toString();` (2认同)

jjo*_*ohn 12

从"get it done dept"开始,一个解决方案就是在SimpleDateFormat完成后使用正则表达式来修复字符串.类似s /(\ d {2})(\ d {2})$/$ 1:$ 2/Perl.

如果您对此感兴趣,我将使用正常工作的Java代码编辑此响应.

但是,是的.我也遇到了这个问题.RFC3339,我在看着你!

编辑:

这适合我

// As a private class member
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

String toRFC3339(Date d)
{
   return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2");
}
Run Code Online (Sandbox Code Playgroud)


Rah*_*ran 11

我花了很多时间寻找同一问题的答案,我在这里找到了一些东西:http://developer.android.com/reference/java/text/SimpleDateFormat.html

建议的答案:

String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());

如果你注意到我使用5'Z'而不是一个.这为输出提供了一个冒号,如下所示:"2008-11-13T12:23:30-08:00".希望能帮助到你.