2011-08-12 14 views
9

मैं ms-since-1970-timestamp को टाइमज़ोन (जर्मनी) के साथ दिनांक में कनवर्ट करना चाहता हूं।अजीब जावा टाइमज़ोन दिनांक रूपांतरण समस्या

यहाँ कोड है जो काम के दो वेरिएंट हैं - कम से कम, मैं इसे का उपयोग कर याद है और यह काम किया:

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Locale; 
import java.util.TimeZone; 

public class TestDate { 

    public static void main(String[] args) { 
     Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Germany"), Locale.GERMANY); 

     Date d = new Date(); 
     cal.setTime(d); 

     System.out.println(String.format("%02d.%02d.%04d %02d:%02d:%02d", 
       cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.MONTH)+1, cal.get(Calendar.YEAR), 
       cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND))); 

     SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.S"); 
     df.setTimeZone(TimeZone.getTimeZone("Germany")); 
     System.out.println(df.format(d)); 
    } 

} 

यह वास्तव में अजीब बात है क्योंकि मैं 2hours की एक समय अंतर की वजह नहीं पा सके ।

यह होना चाहिए: 16:05:20 कोड प्रिंट: 14:05:20 दोनों प्रकारों में।

क्या कोई मेरी मदद कर सकता है और मुझे बता सकता है कि यहां क्या गलत हुआ?

TimeZone.getTimeZone("Germany") 

कोई ऐसे समय क्षेत्र आईडी, इसलिए में जावा अपने अनंत ज्ञान केवल आपके यूटीसी वापस जाने के लिए आपको लगता है कि कुछ भी की गलत बताए बिना फैसला करता है:

+1

+1 अच्छी तरह से लिखा सवाल – andyb

उत्तर

15

यह समस्या है। ऐसा करें:

TimeZone.getTimeZone("Europe/Berlin") 

विकिपीडिया list of IANA time zone IDs है, लेकिन यह कुछ हद तक पुराने हो चुके (लेखन के समय) है, IANA data सबसे अद्यतित है, लेकिन यह आसानी से ब्राउज़ करने योग्य नहीं है ...

-2

दिनांक वस्तु में टाइमज़ोन नहीं है।

Date d = new Date(); // here you have you current time - at that moment it was 16:05:20 

यह आपकी मशीन पर समय है और आप SimpleDateFormat का उपयोग करें और समय क्षेत्र सेट तो आप UTC समय प्रदर्शित कर रहे हैं जब यह UTC + 2 है।

+0

आप कहते हैं के रूप में, दिनांक एक समय क्षेत्र नहीं है - यह है * हमेशा यूटीसी * मूल्य, उस पल में तो यह 14:05 यूटीसी का प्रतिनिधित्व किया। SimpleDateFormat का उपयोग करके और समय क्षेत्र सेट करने के लिए दिए गए समय क्षेत्र के अनुसार * स्थानीय * समय प्रदर्शित करता है - लेकिन दुर्भाग्यवश "जर्मनी" का समय क्षेत्र वास्तव में अस्तित्व में नहीं है, इसलिए इसे यूटीसी में डिफॉल्ट किया गया था। एक * काम * समय क्षेत्र का उपयोग करना सही स्थानीय समय दिखाया होगा। –

1

मेरा मानना ​​है कि समस्या उस प्लेटफॉर्म पर डिफ़ॉल्ट टाइमज़ोन है जिस पर आप चल रहे हैं।

java.util.Date() में समय क्षेत्र है। यह "विरासत" समय क्षेत्र की जानकारी को बनाए रखता है, जो ऐसा प्रतीत होता है, सिस्टम के डिफ़ॉल्ट लोकेल से प्राप्त किया जाता है।

यह कोड।

TimeZone tz = TimeZone.getTimeZone("GMT-03:00"); 
Calendar cal = Calendar.getInstance(tz); 
cal.set(1953, 2, 22, 4, 20, 13); 
Date dateTime = cal.getTime(); 
System.out.println(dateTime.toString()); 

अपने सिस्टम है, जो पीएसटी स्थान का उपयोग करता है पर इस पैदावार: शनि मार्च 21 23:20:13 पीएसटी 1953

मैं नहीं मानता java.util.Date object उपयोग करने के लिए एक तरह से है कि वहाँ, या डेटफॉर्मेट ऑब्जेक्ट्स जो इसका उपयोग करते हैं, "विदेशी" समय क्षेत्र से समय की जानकारी को सटीक रूप से संभालने के लिए।

+0

लोकेल का उल्लेख गलत है। लोकेल के पास समय क्षेत्र के साथ कुछ लेना देना नहीं है। लोकेल दिन-महीनों के नाम और डेट-टाइम मान के पाठपरक प्रतिनिधित्व उत्पन्न करने के लिए डिफ़ॉल्ट प्रारूपों जैसे भाषा को प्रभावित करता है। उदाहरण के लिए, आपके पास भारत में समय क्षेत्र हो सकता है जो क्यूबेक ('लोकेल.कानाडा_फ्रेन्च') के लोकेल के साथ उपयोग किया जाता है। –

0

Answer by Jon Skeet सही है, आपने गलत समय क्षेत्र का नाम उपयोग किया है।

java.time

यहाँ एक समाधान आधुनिक java.time वर्गों है कि पुराने विरासत तिथि-समय वर्गों कि इतने परेशानी और भ्रमित हो सिद्ध कर दिया है प्रतिस्थापित का उपयोग कर रहा है।

Instant instant = Instant.ofEpochMilli(milliseconds_since_1970); // Or Instant.now() for current moment. 
ZoneId z = ZoneId.of("Europe/Berlin"); 
ZonedDateTime zdt = instant.atZone(z); 

उस दिनांक-समय मान का प्रतिनिधित्व करने के लिए स्थानीयकृत स्ट्रिंग जेनरेट करें।

Locale l = Locale.GERMANY; // Or Locale.CANADA_FRENCH, etc. 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(l); 
String output = zdt.format(f); 
संबंधित मुद्दे