3

我无法解析从 API 返回的日期格式并且我从未见过(我相信是自定义格式)。日期示例:

/Date(1353447000000+0000)/

当我第一次遇到这种格式时,我很快就发现它是以毫秒为单位的时间,带有时区偏移。不过,我无法使用 SimpleDateFormat 提取此日期。这是我的第一次尝试:

String weirdDate = "/Date(1353447000000+0000)/";

SimpleDateFormat sdf = new SimpleDateFormat("'/Date('SSSSSSSSSSSSSZ')/'");

Date d1 = sdf.parse(weirdDate);
System.out.println(d1.toString());
System.out.println(d1.getTime());
System.out.println();

Date d2 = new Date(Long.parseLong("1353447000000"));
System.out.println(d2.toString());
System.out.println(d2.getTime());

并输出:

Tue Jan 06 22:51:41 EST 1970
532301760

Tue Nov 20 16:30:00 EST 2012
1353447000000

日期(和解析的毫秒数)甚至还没有接近,我无法弄清楚原因。经过一些故障排除后,我发现我尝试使用 SDF 的方式显然存在缺陷。例子:

String weirdDate = "1353447000000";

SimpleDateFormat sdf = new SimpleDateFormat("S");

Date d1 = sdf.parse(weirdDate);
System.out.println(d1.toString());
System.out.println(d1.getTime());

并输出:

Wed Jan 07 03:51:41 EST 1970
550301760

我不能说我曾经尝试过以这种方式使用 SDF 来解析以毫秒为单位的时间,因为我通常会使用Long.parseLong()并将其直接传递给new Date(long)(实际上我现在拥有的解决方案只是一个常规的表达式和解析长)。我正在寻找一种更简洁的解决方案,我可以轻松地以毫秒为单位提取时区时间,并快速解析为日期,而无需繁琐的手动处理。任何人有任何想法或可以发现我上面的逻辑中的错误?非常感谢您的帮助。

4

2 回答 2

3

取字符串中的毫秒值:

/Date(1353447000000+0000)/

并将该值作为 long 传递给 Date 构造函数:

Date date = new Date(1353447000000);

并使用 SimpleDateFormat 格式化日期对象。

于 2012-12-07T17:02:08.543 回答
1

尽管这几乎就是您现在正在做的事情,但我认为手动方法没有太大问题-除了您必须去那里很可惜!

我不相信您可以仅使用 SDF 来做到这一点。这会给你一个合理“优雅”的约会:

Date date = new Date(Long.parseLong(weirdDate.split("[^\\d]")[6]));

我相信你已经考虑过了,但是你有没有和 API 的生产者谈过,看看他们为什么以这种奇怪的格式输出这个值?如果接口不公开和/或不广泛,他们可能会考虑将其更改为更传统的东西。

于 2012-12-07T17:40:04.087 回答