2011-04-12 35 views
5

我正在使用SimpleDateFormat对象与Date对象,如下所示。问题是Date对象显示错误的日期,与原始字符串相距几分钟。 Date对象似乎在调试器中存储总时间(以毫秒为单位)。日期对象SimpleDateFormat在Java(Android)环境中不能正确解析时间戳字符串

关于这个问题的任何想法?

import java.text.SimpleDateFormat; 

import java.util.Date; 

Date played_at_local; 

dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSSZ"); 

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

//played_at_local shows "Mon Apr 11 22:35:29 America/Chicago 2011" in debugger 

回答

0

05:00 -->> 0500

hh --> HH // error not because of this ,but date is in 24hr format.

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

应该

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-0500"); 
1

试试这个,对我的工作ž应在日期useed,或从格式字符串rmove

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'"); 

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726Z-05:00"); 
13

尝试从格式字符串去掉小数秒。我遇到了同样的问题,但格式略有不同。我的输入格式不是ISO格式(不是“T”,也没有“Z”),但症状是相同的 - 时间是随机分布的几分钟和几秒钟,但其他一切都很好。这是我的日志结果看起来像:

当使用小数第二格式:

SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); 

# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:15:46 EDT 2011 
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:22:07 EDT 2011 
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:08:57 EDT 2011 
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:56:14 EDT 2011 
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:39:25 EDT 2011 

我从格式取下分数秒固定它。

SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:11:15 EDT 2011 
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:09:37 EDT 2011 
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:05:55 EDT 2011 
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:55:05 EDT 2011 
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:38:35 EDT 2011 

我认为正在发生的是,输入字符串的我的“小数秒”的部分过长(同样是在OP例如真)。它似乎只有三个小数位。如果你做数学(取第一个例子):

  • 分数秒=0.271816秒
  • 日期格式所看到的是第二
  • 一千分之二十七万一千八百一十六==的271816/1000271秒
  • 六十〇分之二百七十一=4分钟
  • 271%60 =31秒
  • 17时11分15秒到17点15分46秒正是4分钟,31秒关闭
+2

是,SimpleDateFormat的无法处理微秒。最简单的方法是去掉额外的3位数字,例如date = date.substring(0,date.length() - 4)+“Z”; – 2012-04-05 10:51:16

+0

@scottw:除了不会总是有效的,就像你在我的例子中看到的那样,最后2个项目只有5个数字,而不是6个;所以在某些情况下,可能只有1位小数,这是完全错误的!如果你简单地截断字符串只有3个小数位,那么它也可以正常工作。在我们的例子中,我们不需要微秒(我想很多人也会同意这一点),所以事实证明,从格式字符串中删除'S'就足以从中获得可用的时间。如果你确实需要小数秒,那么是的,你必须做一些字符串操作。 – Joe 2012-04-10 19:02:26

+0

多数民众赞成在一个好点乔 - 我的解决方案只工作,因为我正在从一个服务,总是提供小数秒的6位数(包括零填充),所以我可以摆脱字符串操作。 – 2012-05-17 19:23:42

0

你可以试试这个方法: http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html#valueOf(java.lang.String)

关键的一点是,小数位数是可选的,你可以使用可变数量的人。但是,这似乎并不考虑时区。

从文档:

valueOf 

public static Timestamp valueOf(String s) 
Converts a String object in JDBC timestamp escape format to a Timestamp value. 
Parameters: 
s - timestamp in format yyyy-mm-dd hh:mm:ss[.f...]. The fractional seconds may be omitted. 
Returns: 
corresponding Timestamp value 
Throws: 
IllegalArgumentException - if the given argument does not have the format yyyy-mm-dd hh:mm:ss[.f...] 
0

试试这个:

dTime = new SimpleDateFormat("HH:mm:ss:SS"); 
String sTime = (dTime.format(new java.util.Date())).toString(); 

希望这有助于

+0

请添加更多详情。 – 2014-11-28 10:57:47

+0

请添加一些代码说明。 – Nilesh 2014-11-28 11:09:46

相关问题