2012-11-06 11 views
26

मैं डेटाबेस से टाइमस्टैम्प मान लाने, उन्हें कैलेंडर में बदलने और उन्हें वापस टाइमस्टैंप में बदलने की कोशिश कर रहा हूं, लेकिन वे अपनी सटीकता खो देते हैं।java.sql.Timestamp को java.util में परिवर्तित करना। सटीक खोने के बिना कैलेंडर

यहाँ समस्या

import java.sql.Timestamp; 
import java.util.Calendar; 

public class Test { 
    public static void main(String[] args) 
    { 
     Timestamp timestamp = new Timestamp(112, 10, 5, 15, 39, 11, 801000000); 
     System.out.println("BEFORE "+timestamp.toString()); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(timestamp.getTime()); 
     timestamp = new Timestamp(calendar.getTimeInMillis()); 
     System.out.println("AFTER "+timestamp.toString()); 
    } 
} 

यहाँ रूपांतरण

BEFORE 2012-10-18 14:30:13.362001 
AFTER 2012-10-18 14:30:13.362 

यह अपने सटीक खो देता है का नमूना परिणाम है पुन: पेश करने कोड है। दशमलव मान को रखने के लिए मैं क्या करता हूं?

+0

मैंने अपने विचार में यह कोशिश की है, लेकिन मुझे ऐसा परिणाम नहीं मिला, हर बार जब यह प्रिंट करता है - 'कैलेंडर कैलेंडर = कैलेंडर.getInstance(); \t \t टाइमस्टैम्प टाइमस्टैम्प = नया टाइमस्टैम्प (नई तिथि()। GetTime()); \t \t System.out.println ("1 ->" + टाइमस्टैम्प); // \t \t थ्रेड.current थ्रेड() नींद (1000); \t \t calendar.setTimeInMillis (timestamp.getTime()); \t \t टाइमस्टैम्प = नया टाइमस्टैम्प (calendar.getTimeInMillis()); \t \t System.out.println ("2 ->" + टाइमस्टैम्प); ' –

+0

क्या आप अधिक संदर्भ प्रदान कर सकते हैं? आप इन टाइमस्टैम्प कहां प्राप्त करते हैं, आप उन्हें कैसे आउटपुट करते हैं? – axtavt

+0

मैंने उदाहरण अपडेट किया है, मुझे खेद है कि मेरी गलती से पहले झूठा परिणाम था। – William

उत्तर

25

आप मिलीसेकेंड में समय सेट कर रहे हैं, लेकिन अपने इनपुट सटीक, माइक्रोसेकंड में है, इसलिए निश्चित रूप से आप मिलीसेकेंड से किसी भी परिशुद्धता महीन खोने के लिए जा रहे हैं।

कैलेंडर मिलीसेकंड की तुलना में बेहतर ग्रैन्युलरिटी का समर्थन नहीं करता है। कोई काम नहीं है।

+0

तो, कामकाज क्या है? – William

+2

@ विलियम कोई नहीं है। संपादित उत्तर देखें। – Bohemian

+0

और कोई वैकल्पिक वर्ग नहीं है? – William

8

java.time

जावा 8 में और बाद में हम अब एक समाधान है: नई java.time ढांचे में बनाया गया है JSR 310 द्वारा परिभाषित, Joda-Time से प्रेरित, ThreeTen-Extra परियोजना के लिए बढ़ा दी।।

इस नए ढांचे में nanosecond संकल्प है। पुराने java.util.Date मानों को संभालने के लिए पर्याप्त है, जोडा-टाइम मान, दोनों milliseconds हैं। और Postgres जैसे कुछ डेटाबेस द्वारा उपयोग किए गए microseconds को संभालने के लिए पर्याप्त है। जैसे कुछ डेटाबेस नैनोसेकंड का उपयोग करते हैं। तो जावा.टाइम इसे सभी, या कम से कम सभी मुख्यधारा की स्थितियों को संभाल सकता है। एकमात्र अपवाद विशिष्ट वैज्ञानिक या इंजीनियरिंग स्थितियां होंगी।

Image

जावा 8 के साथ

, पुराने वर्गों java.time से/परिवर्तित करने के लिए नए तरीकों को मिला है। java.sql.Timestamp पर नए toInstant और fromInstant विधियों का उपयोग करें। Instant कक्षा में युग से नैनोसेकंड की गिनती है, 1 9 70 यूटीसी के पहले पल (मूल रूप से, विवरण के लिए कक्षा दस्तावेज़ देखें)।

Instant से आप ZonedDateTime ऑब्जेक्ट प्राप्त कर सकते हैं।

java.sql.Timestamp ts = myResultSet.getTimestamp(1); 
Instant instant = ts.toInstant(); 
ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
संबंधित मुद्दे