2011-04-12 19 views
5

SimpleDateFormat nesnesini, aşağıda gösterildiği gibi Date nesnesinde kullanıyorum. Sorun, lisenin Date nesnesinin yanlış tarihi gösterdiğidir; bu, orijinal dizeden birkaç dakika uzakta olur. Date nesnesinin, saatin hata ayıklayıcısında toplam milisaniyede saklandığı görünüyor.Tarih nesnesi SimpleDateFormat, Java (Android) ortamında zaman damgası dizesini doğru şekilde ayrıştırma

Sorunla ilgili herhangi bir fikir var mı?

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 

cevap

0

05:00 -->> 0500

ve

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"); 

olmalıdır

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

Z tarihi useed veya 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

biçim dizesi fraksiyonel saniye kaldırmayı deneyin Biçim String edilmelidir benim için çalışıyor, bu deneyin. Sadece aynı konuya girdim, ama biraz farklı bir formatla. Giriş formatım ISO formatında değildi ("T" yok, ve "Z" yok), ama belirti aynıydı - zaman, birkaç dakika ve saniye olarak rastgele sayıldı, ama her şey yolundaydı. Fraksiyonel ikinci biçimi kullanırken

:

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 

ben biçiminden fraksiyonel saniye kaldırarak sabit Bu benim Günlük sonuçları benziyordu şeydir.


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 

Ne oluyor düşünüyorum girdi dizesi benim "fraksiyonel saniye" bölümü (aynı OP örnekte doğrudur) çok uzun olmasıdır. Sadece üç ondalık basamağı bekliyor gibi görünüyor. Hesapladığınızda (ilk örneği ele):

  • fraksiyonel saniye = 0,271816 saniye DateFormat gördükleri
  • ikinci
  • 271816/1000 == ait 271816/1000 271 saniye
  • 271/60 olduğunu = 4 dakika
  • 271% 60 = 31 saniye 17:15:46 için
  • 17:11:15 tam olarak 4 dakika,
kapalı 31 saniyedir 210
+2

Evet, SimpleDateFormat işleyemez mikrosaniye. Yapılacak en kolay şey, fazladan 3 rakamı dışarı çıkarmaktır, örn. date = date.substring (0, date.length() - 4) + "Z"; –

+0

@scottw: her zaman işe yaramayacak durum haricinde, örneğimde de görebileceğiniz gibi, son 2 öğenin 6 yerine yalnızca 5 hanesi var; Yani bazı durumlarda, tamamen yanlış olan sadece 1 ondalık basamak olabilir! Dizeyi sadece 3 ondalık basamağa sahip olacak şekilde kırpırsanız, o zaman iyi çalışır. Bizim durumumuzda, mikrosaniye ihtiyaç duymadık (sanırım birçok insan da bununla aynı fikirde olacaktı), bu yüzden sadece 'S' 'in format dizisinden çıkarılması, kullanılabilir bir zaman elde etmek için yeterlidir. Kesirli saniyeye ihtiyacınız varsa, evet, bazı dize manipülasyonu yapmak zorundasınız. – Joe

+0

iyi bir nokta bu Joe - çözümüm, her zaman kesirli saniyeler için 6 basamaklı (sıfırlarla doldurma dahil) bir hizmetten çalıştığım için çalıştı, böylece string manipülasyonu ile kurtulabilecektim. –

0

bu yöntemi deneyebilirsiniz: http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html#valueOf(java.lang.String)

önemli şey ondalık basamak isteğe bağlı olduğunu ve bunlardan bir değişken numarası kullanabilirsiniz. Ancak, bu zaman dilimini hesaba katmıyor gibi görünüyor.Dokümanlar

:

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

bu deneyin:

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

Umut bu yardım

+0

Lütfen daha fazla detay ekleyin. –

+0

Lütfen bazı kod açıklamalarını ekleyin. – Nilesh

İlgili konular