2010-11-17 21 views
9

के साथ स्ट्रिंग को आज तक कनवर्ट करना मेरे पास पैटर्न yyyy-MM-dd hh: mm है और मैं समय क्षेत्र ऑब्जेक्ट को अलग से प्राप्त कर सकता हूं जिसमें उपर्युक्त स्ट्रिंग दिनांक का प्रतिनिधित्व करती है।टाइमज़ोन

मैं इसे नीचे दिए प्रारूप में कनवर्ट करना चाहता हूं। yyyy-MM-dd एचएच: मिमी: एसएस जेड

मैं यह कैसे कर सकता हूं?

+0

http://joda-time.sourceforge.net/ जावा में सभी दिनांक मैनिप्लेशंस को बहुत आसान बनाता है – NimChimpsky

+0

@ एमिल मुझे आपके बाद यह सुविधा पता चल गई :) :) धन्यवाद। – John

+1

एफवाईआई, [जोडा-टाइम] (http://www.joda.org/joda-time/) प्रोजेक्ट अब [रखरखाव मोड] (https://en.wikipedia.org/wiki/Maintenance_mode) में है, साथ टीम [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) कक्षाओं में माइग्रेशन की सलाह दे रही है। –

उत्तर

5

उपयोग SimpleDateFormat

String string1 = "2009-10-10 12:12:12 "; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") 
sdf.setTimeZone(tz); 
Date date = sdf.parse(string1); 
+0

कुछ बार getID() इस "अमेरिका/अर्जेंटीना/उशुआइया" की तरह स्ट्रिंग देता है। तो मैं इसे – John

+0

-1 का उपयोग कैसे कर सकता हूं: यह अधिकांश टाइमज़ोन पर ParseException फेंक देगा। –

+0

@ माइकल Konietzka @ शाल मैं जल्दी से मुझे याद किया, जवाब –

0

अपनी तिथि पद्धति का उपयोग कर SimpleDateFormat का एक नया उदाहरण बनाएँ। इसके बाद आप दिनांक स्ट्रिंग को java.util.Date ऑब्जेक्ट में कनवर्ट करने के लिए इसे पार्स विधि कह सकते हैं।

16

आप yyyy-MM-dd HH:mm:ss साथ SimpleDateFormat उपयोग कर सकते हैं और स्पष्ट रूप से TimeZone सेट:

public static Date getSomeDate(final String str, final TimeZone tz) 
    throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a"); 
    sdf.setTimeZone(tz); 
    return sdf.parse(str); 
} 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
* @throws ParseException 
*/ 
public static void main(final String[] args) throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin")))); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago")))); 
} 

प्रिंटों आउट:

2010-11-17 13:12:00 +0100

2010- 11-17 20:12:00 +0100

अद्यतन 2010-12-01: आप स्पष्ट रूप से एक विशेष समय क्षेत्र प्रिंटआउट की, SimpleDateFormat में सेट करना चाहते हैं: प्रारूप है जो आम तौर पर प्रयोग किया जाता है

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST")))); 

कौन सा 2010-11-17 13:12:00 +0530

+0

धन्यवाद श्री मिचेल, टाइमज़ोन के अनुसार तिथि और समय बदल जाता है। +100 को नीचे छोड़ दें, यह टाइमज़ोन ऑफ़सेट – John

+0

@ शाल में नहीं बदलता है : क्षमा करें, मैं आपकी दूसरी वाक्य को समझ नहीं पा रहा हूं। क्या आपको लगता है कि कुछ गलत है? –

+0

@ माइकल, मैं कह रहा हूं कि समय ठीक से परिवर्तित हो रहा है लेकिन "+0100" मुद्रित दिनांक मूल्यों में "Z" भाग देखें, यह बदलता नहीं है। उदाहरण के लिए यदि मैं जीएमटी से आईएसटी में एक तारीख को परिवर्तित कर रहा हूं तो " जेड "परिवर्तित तिथि का हिस्सा" +0530 "होना चाहिए। – John

0

निस्संदेह प्रिंट होगा एक रूप 2014-10-05T15:23:01Z (TZ)

है कि एक के लिए की हो इस कोड

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
String dateInString = "2014-10-05T15:23:01Z"; 

try { 

    Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000")); 
    System.out.println(date); 

} catch (ParseException e) { 
    e.printStackTrace(); 
} 
उपयोग करने के लिए है

इसका आउटपुट सूर्य अक्टूबर 05 20:53:01 IST 2014

हालांकि, मुझे यकीन नहीं है कि हमें "Z" को क्यों बदलना है यदि आप प्रतिस्थापित नहीं करते हैं तो सभी प्रोग्राम विफल हो जाएंगे।

4

tl; डॉ

LocalDateTime.parse( // Parse string as value without time zone. 
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a") 
).atZone(ZoneId.of("America/Montreal")) // Assign time zone. 
.toString()    // Generate string: 2017-01-23T17:34:00Z 
.replace("T" , " ") // Substitute SPACE for 'T' in middle. 
.replace("Z" , " Z") // Insert SPACE before 'Z'. 

बचें विरासत तिथि-समय वर्गों

अन्य जवाब परेशानी पुराने तिथि-समय वर्गों (Date, Calendar, आदि), अब विरासत, द्वारा जगह ले ली का उपयोग जावा। समय कक्षाएं। मिमी एक

इस तरह के एक इनपुट स्ट्रिंग के कोई संकेत का अभाव ऑफसेट-से-यूटीसी या समय क्षेत्र:

LocalDateTime

मैं पैटर्न yyyy-MM-dd hh में एक स्ट्रिंग है। तो हम LocalDateTime के रूप में पार्स करते हैं।

DateTimeFormatter ऑब्जेक्ट के साथ अपने इनपुट से मेल खाने के लिए एक स्वरूपण पैटर्न परिभाषित करें।

String input = "2017-01-23 12:34 PM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a"); 
LocalDateTime ldt = LocalDateTime.parse(input , f); 

ldt.toString(): 2017-01-23T12: 34

ध्यान दें कि एक LocalDateTimeनहीं एक विशेष क्षण, तभी संभव क्षणों की एक सीमा के बारे में एक अस्पष्ट विचार है । उदाहरण के लिए, पेरिस फ्रांस में मध्यरात्रि के कुछ मिनट बाद भी मॉन्ट्रियल कनाडा में "कल" ​​है। तो Europe/Paris या America/Montreal जैसे समय क्षेत्र के संदर्भ के बिना, बस "मध्यरात्रि के कुछ मिनट बाद" का कोई मतलब नहीं है।

ZoneId

और मैं समय क्षेत्र वस्तु अलग है, जिसमें ऊपर स्ट्रिंग दिनांक को दर्शाता है प्राप्त कर सकते हैं।

एक समय क्षेत्र ZoneId वर्ग का प्रतिनिधित्व करती है।

ऐसे America/Montreal, Africa/Casablanca, या Pacific/Auckland रूप continent/region के प्रारूप में एक proper time zone name निर्दिष्ट करें,। 0-या IST जैसे 3-4 अक्षर संक्षेप का उपयोग न करें क्योंकि सही समय क्षेत्र, मानकीकृत नहीं, और यहां तक ​​कि अनूठा (!) भी नहीं है।

ZoneId z = ZoneId.of("America/Montreal"); 

ZonedDateTime

ZoneId लागू करें एक ZonedDateTime जो वास्तव में समय, इतिहास में एक विशेष क्षण पर एक बिंदु है पाने के लिए।

ZonedDateTime zdt = ldt.atZone(z); 

zdt.toString(): 2017-01-23T12: 34-05: 00 [अमेरिका/मॉन्ट्रियल]

Instant

मैं करने के लिए इस परिवर्तित करना चाहते हैं नीचे प्रारूप। yyyy-MM-yyyy HH: mm: ss Z

पहले, जानते हैं कि एक Z शाब्दिक वर्ण Zulu के लिए कम है और UTC का मतलब है। दूसरे शब्दों में, शून्य घंटे के offset-from-UTC, +00:00

Instant वर्ग ((9) एक दशमलव भिन्न के अंकों को नौ तक) nanoseconds के एक संकल्प के साथ UTC में समय रेखा पर एक पल के प्रतिनिधित्व करता है।

आप ऑब्जेक्ट को ZonedDateTime से निकाल सकते हैं।

Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC. 

मानक ISO 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए इस तरह के 2017-01-22T18:21:13.354Z के रूप में, फोन toString। मानक प्रारूप में कोई रिक्त स्थान नहीं है, घंटे-मिनट-सेकंड से वर्ष-महीने की तारीख को अलग करने के लिए T का उपयोग करता है, और शून्य के ऑफसेट के लिए Z कैनोनिक रूप से जोड़ता है।

String output = instant.toString(); 

instant.toString(): 2017-01-23T17: 34: 00Z

मैं दृढ़ता से संभव मानक प्रारूप जब भी उपयोग करने का सुझाव। यदि आप अपने निर्दिष्ट वांछित प्रारूप में रिक्त स्थान का उपयोग करने पर जोर देते हैं, तो DateTimeFormatter ऑब्जेक्ट में अपना स्वयं का स्वरूपण पैटर्न परिभाषित करें या Instant::toString के आउटपुट पर केवल एक स्ट्रिंग मैनिपुलेशन करें।

String output = instant.toString() 
         .replace("T" , " ") // Substitute SPACE for T. 
         .replace("Z" , " Z"); // Insert SPACE before Z. 

उत्पादन: 2017/01/23 17:34:00 जेड

इस code live at IdeOne.com की कोशिश करो।


java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacyjava.util.Date, Calendar, & SimpleDateFormat जैसी समय-समय पर कक्षाएं प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8 और SE 9 और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • ThreeTenABP परियोजना adapts ThreeTen-backport विशेष रूप से (जैसा कि ऊपर उल्लेख) Android के लिए।
    • How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more

संबंधित मुद्दे