我无法解析我从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)
(并且事实上我现在的解决方案只是一个正则表达式并解析一个长的)。我正在寻找一种更清洁的解决方案,我可以使用时区轻松地在几毫秒内提取这个时间,并快速解析成一个没有杂乱的手动处理的日期。任何人有任何想法或可以发现我的逻辑上面的错误?非常感谢帮助。
答案 0 :(得分:3)
取字符串中的毫秒值:
/Date(1353447000000+0000)/
并将该值作为long传递给Date构造函数:
Date date = new Date(1353447000000);
使用SimpleDateFormat格式化日期对象。
答案 1 :(得分:1)
即使它现在正是你现在正在做的事情,但我认为手动方法并没有太大的错误 - 除了羞耻你必须去那里!
我不相信你只能用SDF做到这一点。 这将合理地“优雅地”给你一个日期:
Date date = new Date(Long.parseLong(weirdDate.split("[^\\d]")[6]));
我确定你已经考虑过了,但是你有没有和API的制作人谈过,看看为什么他们以这种奇怪的格式输出这个值?如果界面不公开和/或不广泛,他们可能会考虑将其更改为更传统的东西。