2011-04-12 14 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

相關問題