कन्वर्ट तिथि / समय दिए गए Timezone - जावा के लिए


80

मैं इस GMT टाइम स्टैम्प को GMT + 13 में बदलना चाहता हूं:

2011-10-06 03:35:05

मैंने इस VERY मूल कार्य को करने के लिए DateFormat, TimeZone, Date, GregorianCalendar आदि के लगभग 100 विभिन्न संयोजनों की कोशिश की है।

यह कोड वह है जो मुझे CURRENT TIME के ​​लिए चाहिए:

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

String newZealandTime = formatter.format(calendar.getTime());

लेकिन मैं जो चाहता हूं वह वर्तमान समय का उपयोग करने के बजाय समय निर्धारित करना है।

मैंने पाया कि कभी भी मैं इस तरह समय निर्धारित करने की कोशिश करता हूं:

calendar.setTime(new Date(1317816735000L));

स्थानीय मशीन के TimeZone का उपयोग किया जाता है। ऐसा क्यों है? मुझे पता है कि जब "नई तारीख ()" UTC + 0 समय देता है तो जब आप समय को मिलीसेकंड में सेट करते हैं तो क्या यह नहीं लगता कि समय UTC में है?

क्या यह संभव है:

  1. किसी ऑब्जेक्ट पर समय सेट करें (कैलेंडर / दिनांक / टाइमस्टैम्प)
  2. (संभवतः) प्रारंभिक समय स्टैम्प का TimeZone सेट करें (Calendar.setTimeZone (...):
  3. एक नया TimeZone (formatter.setTimeZone (...)) के साथ समय टिकट को प्रारूपित करें
  4. नए टाइम ज़ोन समय के साथ एक स्ट्रिंग लौटें। (formatter.format (Calendar.getTime ()))

किसी भी मदद के लिए अग्रिम धन्यवाद: डी


एक पोस्ट में बहुत सारे सवाल ...
Barmaley

वही 2 प्रश्न पूछे गए जो केवल 2 हैं, दूसरी बार स्पष्टता के लिए एक परिदृश्य एल्गोरिथ्म से पूछा गया है। इनपुट के लिए धन्यवाद:
ट्रेवगा

केवल समस्या की तरह लगता है कि 1317816735000Lके लिए गलत टाइमस्टैम्प है 2011-10-06 03:35:05 GMT। अन्यथा आपका दृष्टिकोण सही है।
अगुरार

1
FYI करें, पुराने समय की परेशान करने वाली पुरानी कक्षाएं जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब लीगेसी , जावा 8 और बाद में निर्मित java.time कक्षाओं द्वारा ली गई । ओरेकल द्वारा ट्यूटोरियल देखें ।
तुलसी बॉर्क

जवाबों:


62

मेरे लिए, ऐसा करने का सबसे सरल तरीका है:

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//Here you say to java the initial timezone. This is the secret
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
//Will print in UTC
System.out.println(sdf.format(calendar.getTime()));    

//Here you set to your timezone
sdf.setTimeZone(TimeZone.getDefault());
//Will print on your default Timezone
System.out.println(sdf.format(calendar.getTime()));

1
@Charleston reviewलाइन में क्या हैdate = sdf.parse(review);
09Q71AO534

1
@Charleston लेकिन SDF में ऐसी कोई विधि प्रकार sdf.parse(DateObject)नहीं है, जावा में परिभाषित नहीं है जिसका मैं उपयोग कर रहा हूं JDK.1.7
09Q71AO534

मुझे अपने दूसरे उत्तर के बारे में बहुत खेद है। मैं यह भी परीक्षण नहीं! लेकिन अब इसका परीक्षण और काम कर रहा है!
चार्ल्सटन

1
स्ट्रिंग के बजाय आपको वास्तविक दिनांक कैसे मिलती है?
ट्यूलेंस कोर्डोवा 19

1
शायद यह होना चाहिए: SimpleDateFormat ("yyyy-MM-dd hh: mm: ss")
मार्कोस

31

कंप्यूटर समय कैसे काम करता है यह समझना बहुत महत्वपूर्ण है। इसके साथ ही मैं मानता हूं कि अगर कोई एपीआई आपको वास्तविक समय की तरह कंप्यूटर समय की प्रक्रिया में मदद करने के लिए बनाया जाता है, तो इसे इस तरह से काम करना चाहिए जिससे आप वास्तविक समय की तरह इसका इलाज कर सकें। अधिकांश भाग के लिए यह मामला है लेकिन कुछ प्रमुख ओवरसाइट हैं जिन पर ध्यान देने की आवश्यकता है।

वैसे भी मैं पचाता हूँ !! यदि आपके पास आपकी UTC ऑफसेट (GMT ऑफ़सेट्स की तुलना में UTC में काम करने के लिए बेहतर है) तो आप मिलीसेकंड में समय की गणना कर सकते हैं और इसे अपने टाइमस्टैम्प में जोड़ सकते हैं। ध्यान दें कि एक एसक्यूएल टाइमस्टैम्प जावा टाइमस्टैम्प से भिन्न हो सकता है क्योंकि जिस तरह से युगांतर की गणना की जाती है वह हमेशा एक जैसा नहीं होता है - डेटाबेस प्रौद्योगिकियों और ऑपरेटिंग सिस्टम पर निर्भर करता है।

मैं आपको सलाह दूंगा कि आप अपने समय के स्टैम्प के रूप में System.currentTimeMillis () का उपयोग करें क्योंकि इनको जावा में अधिक लगातार संसाधित किया जा सकता है।

अपने ऑफसेट की गणना करने के लिए आप कुछ इस तरह की कोशिश कर सकते हैं:

Long gmtTime =1317951113613L; // 2.32pm NZDT
Long timezoneAlteredTime = 0L;

if (offset != 0L) {
    int multiplier = (offset*60)*(60*1000);
    timezoneAlteredTime = gmtTime + multiplier;
} else {
    timezoneAlteredTime = gmtTime;
}

Calendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(timezoneAlteredTime);

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");

formatter.setCalendar(calendar);
formatter.setTimeZone(TimeZone.getTimeZone(timeZone));

String newZealandTime = formatter.format(calendar.getTime());

मुझे आशा है कि यह मददगार है!


@ user726478 जब हम टाइमज़ोन स्ट्रिंग जानते हैं तो क्या यह सही है? लंबे timezoneAlteredTime = gmtTime + TimeZone.getTimeZone ( "एशिया / कोलकाता") getRawOffset ();। "
Kanagavelu Sugumar

4
अच्छा नही। समय क्षेत्र ऑफ़सेट स्थिर नहीं है। यह वास्तविक तिथि पर निर्भर करता है।
दिमित्री ट्रिफोनोव

1
स्ट्रिंग के बजाय आपको वास्तविक दिनांक कैसे मिलती है?
ट्यूलेंस कोर्डोवा 19

@ KanagaveluSugumar यहां ऑफ़सेट घंटे है
MY

25

हमेशा की तरह, मैं जावा में दिनांक और समय के बारे में इस लेख को पढ़ने की सलाह देता हूं ताकि आप इसे समझ सकें।

मूल विचार यह है कि 'हुड के तहत' सब कुछ यूटीसी मिलीसेकंड में युग के बाद से किया जाता है। इसका अर्थ है कि यदि आप उपयोगकर्ता के लिए स्ट्रिंग स्वरूपण के अपवाद के साथ समय क्षेत्र का उपयोग किए बिना काम करते हैं तो यह सबसे आसान है।

इसलिए मैंने आपके द्वारा सुझाए गए अधिकांश चरणों को छोड़ दिया।

  1. किसी ऑब्जेक्ट (दिनांक, कैलेंडर आदि) पर समय सेट करें।
  2. फ़ॉर्म ज़ोन ऑब्जेक्ट पर समय क्षेत्र सेट करें।
  3. फ़ॉर्मेटर से एक स्ट्रिंग लौटें।

वैकल्पिक रूप से, आप जोडा समय का उपयोग कर सकते हैं । मैंने सुना है कि यह बहुत अधिक सहज ज्ञान युक्त एपीआई है।


हाय Bringer128 आपके उत्तर के लिए धन्यवाद यह सिर्फ मुझे हास्यास्पद लगता है कि किसी दिए गए टाइमज़ोन के लिए टाइमस्टैम्प को समायोजित करने का कोई सीधा आगे का तरीका नहीं है। क्यों कार्यक्षमता शामिल है अगर यह सब करता है स्वरूपित स्ट्रिंग में टाइमजोन टैग को बदल देता है ... मैं जोडा समय की कोशिश करूंगा। धन्यवाद
त्रिवेणी

@travega एक सरल तरीका है, यदि आप UTC के रूप में अपने समय का प्रतिनिधित्व करते हैं और इसे SimpleDateFormat के साथ प्रारूपित करते हैं। यह केवल 'जेड' भाग (टाइमजोन टैग) नहीं है जो संशोधित हो जाता है, पूरी तारीख करता है। जब वे एक ही तिथि को प्रारूपित करते हैं, तो अलग-अलग TimeZones के साथ दो अलग-अलग SimpleDateFormat ऑब्जेक्ट होने के परिणामों की जांच करें।
ब्रिंगरहैस

स्ट्रिंग के बजाय आपको वास्तविक दिनांक कैसे मिलती है?
ट्यूलेंस कोर्डोवा 19

@ TulainsCórdova मुझे लगता है कि आपको और अधिक विस्तार से समझाने की आवश्यकता होगी। क्या आप संबंधित प्रश्न खोजने के लिए एक प्रश्न या खोज बना सकते हैं जो आपके विशिष्ट प्रश्न को हल कर सकता है?
ब्रिंजर128

19

tl; डॉ

Instant.ofEpochMilli( 1_317_816_735_000L )
    .atZone( ZoneId.of( "Pacific/Auckland" ) )
    .format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )

… भी…

LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
    .atZone( ZoneId.of( "Pacific/Auckland" ) )

java.time

प्रश्न और अधिकांश उत्तर जावा के शुरुआती संस्करणों से पुरानी विरासत तिथि-समय की कक्षाओं का उपयोग करते हैं। ये पुराने वर्ग परेशान और भ्रमित करने वाले साबित हुए हैं। इनसे बचें। इसके बजाय java.time कक्षाओं का उपयोग करें।

आईएसओ 8601

आपका इनपुट स्ट्रिंग मानक ISO 8601 प्रारूप में लगभग है। बस एक के साथ बीच में अंतरिक्ष की जगह T

String input = "2011-10-06 03:35:05".replace( " " , "T" );

LocalDateTime

अब पार्स के LocalDateTimeकारण इनपुट में ऑफ़सेट-यूटीसी या टाइम ज़ोन के बारे में कोई जानकारी नहीं है। ए LocalDateTimeमें ऑफसेट की कोई अवधारणा नहीं है और न ही समय क्षेत्र है, इसलिए यह समय पर वास्तविक क्षण का प्रतिनिधित्व नहीं करता है ।

LocalDateTime ldt = LocalDateTime.parse( input );

ZoneOffset

आप यह कहते हुए प्रतीत होते हैं कि व्यावसायिक संदर्भ से आप जानते हैं कि इस तार का इरादा उस क्षण का प्रतिनिधित्व करना है जो यूटीसी से 13 घंटे आगे है। इसलिए हम तुरंत ए ZoneOffset

ZoneOffset offset = ZoneOffset.ofHours( 13 ); // 13 hours ahead of UTC, in the far east of the globe.

OffsetDateTime

OffsetDateTimeऑब्जेक्ट प्राप्त करने के लिए इसे लागू करें । यह समयरेखा पर एक वास्तविक क्षण बन जाता है।

OffsetDateTime odt = ldt.atOffset( offset);

ZoneId

लेकिन फिर आप न्यूजीलैंड का उल्लेख करते हैं। तो आपके मन में एक विशिष्ट समय क्षेत्र था। डे-टाइम सेविंग टाइम (DST) जैसी विसंगतियों से निपटने के लिए एक टाइम ज़ोन एक ऑफ़सेट-यूटीसी प्लस है। तो हम एक निर्दिष्ट कर सकते हैं ZoneIdएक करने के लिए ZonedDateTimeएक मात्र ऑफसेट के बजाय।

एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग ESTया ISTके रूप में वे सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं नहीं कर रहे हैं (!)। उदाहरण के लिए, Pacific/Auckland

ZoneId z = ZoneId.of( "Pacific/Auckland" );

ZonedDateTime

लागू करें ZoneId

ZonedDateTime zdt = ldt.atZone( z );

आप समयरेखा पर उसी क्षण के लिए किसी अन्य क्षेत्र में आसानी से समायोजित कर सकते हैं।

ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );  // Same moment in time, but seen through lens of Paris wall-clock time.

युग से गिनती

मैं दृढ़ता से तारीख के समय के मूल्यों को संभालने के खिलाफ सिफारिश करता हूं, जैसे कि यूओच से एक गिनती, जैसे कि 1970 यूटीसी की शुरुआत से मिलीसेकंड। लेकिन यदि आप ऐसा करना चाहते हैं, तो Instantऐसी संख्या से बनाएं ।

Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );

फिर एक समय क्षेत्र निर्दिष्ट करें जैसा कि ऊपर देखा गया है, यदि वांछित है, तो यूटीसी से दूर जाने के लिए।

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );

आपका मान 1_317_816_735_000Lहै:

  • 2011-10-05T12:12:15Z (बुध, ०५ अक्टूबर २०११ १२:१२:१५ GMT)
  • 2011-10-06T01:12:15+13:00[Pacific/Auckland] (गुरुवार 06 अक्टूबर, 2011 01:12:15 ऑकलैंड न्यूजीलैंड में)।

तार पैदा करना

मानक आईएसओ 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए , बस कॉल करें toString। ध्यान दें कि ZonedDateTimeवर्ग ब्रैकेट में समय क्षेत्र का नाम जोड़कर मानक प्रारूप को बुद्धिमानी से विस्तारित किया गया है।

String output = zdt.toString();

अन्य प्रारूपों के लिए, DateTimeFormatterवर्ग के लिए ढेर अतिप्रवाह खोजें । पहले से ही कई बार कवर किया।

एक FormatStyleऔर एक निर्दिष्ट करें Locale

Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );

ध्यान दें कि समय क्षेत्र का लोकेल से कोई लेना- देना नहीं है। आपके पास Europe/Parisजापानी भाषा और सांस्कृतिक मानदंडों में एक Asia/Kolkataतिथि-समय प्रदर्शित हो सकता है , या पुर्तगाली भाषा और ब्राजील के सांस्कृतिक मानदंडों में प्रदर्शित तिथि-समय हो सकता है।

जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं जैसे परेशानी पुराने तिथि-समय वर्गों को प्रतिस्थापित java.util.Date, .Calendar, और java.text.SimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास java.time को सलाह देता है।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें।

Java.time की अधिकांश कार्यक्षमता थ्रीटेन-बैकपोर्ट में जावा 6 और 7 के लिए वापस पोर्ट की गई है और आगे थ्रीटेनबप में Android के लिए अनुकूलित है (देखें कि कैसे उपयोग करें ... )।

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


10

समाधान वास्तव में काफी सरल है (शुद्ध, सरल जावा):

System.out.println(" NZ Local Time: 2011-10-06 03:35:05");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localNZ = LocalDateTime.parse("2011-10-06 03:35:05",formatter);
ZonedDateTime zonedNZ = ZonedDateTime.of(localNZ,ZoneId.of("+13:00"));
LocalDateTime localUTC = zonedNZ.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
System.out.println("UTC Local Time: "+localUTC.format(formatter));

OUTPUT IS:

 NZ Local Time: 2011-10-06 03:35:05
UTC Local Time: 2011-10-05 14:35:05

1
यह 4 साल पहले हल किया गया था और आपके समाधान में कुछ नया नहीं जोड़ा गया है।
१०:१५ को

1
मुझे लगता है कि यह जावा 8 का उपयोग करके नया दृष्टिकोण है, लेकिन निम्न गुणवत्ता में उत्तर देता है।
प्रेज़ेमेक

6

के बारे में एक नज़र था और मुझे नहीं लगता है कि जावा में एक टाइमज़ोन है जो GMT + 13. है। इसलिए मुझे लगता है कि आपको इसका उपयोग करना होगा:

Calendar calendar = Calendar.getInstance();
//OR Calendar.getInstance(TimeZone.getTimeZone("GMT"));

calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY)+13);

Date d = calendar.getTime();

(यदि फिर "GMT" को उस Timezone में बदल दिया जाए और कोड की दूसरी पंक्ति को हटा दिया जाए)

या

SimpleDateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("GMT+13"));
System.out.println(df.format(c.getTime()));

यदि आप एक विशिष्ट समय / तिथि निर्धारित करना चाहते हैं, तो आप इसका उपयोग भी कर सकते हैं:

    calendar.set(Calendar.DATE, 15);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.YEAR, 2011);
calendar.set(Calendar.HOUR_OF_DAY, 13); 
calendar.set(Calendar.MINUTE, 45);
calendar.set(Calendar.SECOND, 00);

1
हे क्रेग आपके उत्तर के लिए धन्यवाद। जावा समर्थन नहीं करता / असमर्थित आईएसओ समय मानकों जीएमटी एक वैश्विक समय मानक जावा से स्वतंत्र संचालित है। समय / कैलेंडर Apis मानक का पालन करता है और GMT + 13 किसी भी GMT + 12 क्षेत्र में NZDT या दिन के उजाले बचत समय को संदर्भित करता है। आपके नमूना कोड के बारे में, मेरे पास आपके परिदृश्य में बिना किसी समस्या के काम करना है, जैसा कि मेरे आईपी में उल्लेख किया गया है। मैं जिस समस्या का सामना कर रहा हूं वह एक टाइम स्टैम्प को परिभाषित करने और मूल समय स्टैम्प के सटीक टाइमज़ोन विशिष्ट वेरिएंट को आउटपुट करने के लिए है, वर्तमान समय की व्युत्पन्नता नहीं है जो आपका कोड करता है। धन्यवाद T
11

3

हम ऑफसेट मूल्य का उपयोग करके इसे संभाल सकते हैं

 public static long convertDateTimeZone(long lngDate, String fromTimeZone,
        String toTimeZone){
    TimeZone toTZ = TimeZone.getTimeZone(toTimeZone);
    Calendar toCal = Calendar.getInstance(toTZ);        

    TimeZone fromTZ = TimeZone.getTimeZone(fromTimeZone);
    Calendar fromCal = Calendar.getInstance(fromTZ);
    fromCal.setTimeInMillis(lngDate);
    toCal.setTimeInMillis(fromCal.getTimeInMillis()
            + toTZ.getOffset(fromCal.getTimeInMillis())
            - TimeZone.getDefault().getOffset(fromCal.getTimeInMillis()));      
    return toCal.getTimeInMillis();
}

टेस्ट कोड स्निपेट:

 System.out.println(new Date().getTime())
 System.out.println(convertDateTimeZone(new Date().getTime(), TimeZone
                .getDefault().getID(), "EST"));

आउटपुट: 1387353270742 1387335270742


2

मेरे पास इस कोड की कोशिश है

try{
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss Z");
            Date datetime = new Date();

            System.out.println("date "+sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

            System.out.println("GMT "+ sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("GMT+13"));

            System.out.println("GMT+13 "+ sdf.format(datetime));

            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

            System.out.println("utc "+sdf.format(datetime));

            Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

            DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");    
            formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));  

            String newZealandTime = formatter.format(calendar.getTime());

            System.out.println("using calendar "+newZealandTime);

        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

और यह परिणाम हो रहा है

date 06-10-2011 10:40:05 +0530
GMT 06-10-2011 05:10:05 +0000 // here getting 5:10:05
GMT+13 06-10-2011 06:10:05 +1300 // here getting 6:10:05
utc 06-10-2011 05:10:05 +0000
using calendar 06 Oct 2011 18:10:05 GMT+13:00

हाय आप इनपुट के लिए धन्यवाद, लेकिन आप इस बिंदु को याद कर रहे हैं। जैसा कि मेरे आईपी में उल्लेख किया गया है कि मेरे पास वर्तमान समय की मुहर के लिए काम कर रहा है। मुद्दा टाइम स्टैम्प स्थापित करने और फिर सटीक टाइमज़ोन विशिष्ट आउटपुट उत्पन्न करने के साथ है।
travega

यदि आप समय बदलते हैं तो यह भी काम करता है। समय क्षेत्र को प्रारूप ऑब्जेक्ट में सेट किया गया था, इसलिए जो भी समय आपने पास किया, वह समयक्षेत्र के आधार पर होगा जो प्रारूप ऑब्जेक्ट में निर्दिष्ट किया गया था
प्रतीक

हम्म्म्म ... मैंने जोड़ने की कोशिश की है: datetime.setTime (टाइमस्टैम्प.वल्यूऑफ ("2011-10-06 03:35:05")। GetTime ()); और फिर भी यह काम नहीं करता है। जब आप समय निर्धारित करते हैं तो यह कैसे काम करता है?
travega

@Pratik: मैं एएसटी समय क्षेत्र कैसे प्राप्त कर सकता हूं।
वेद प्रकाश

2

Joda समय

Java.util.Date/Calendar क्लासेस एक गड़बड़ हैं और इससे बचा जाना चाहिए।

अद्यतन: जोडा-टाइम परियोजना रखरखाव मोड में है। टीम java.time कक्षाओं में प्रवास की सलाह देती है।

यहाँ आपका जवाब Joda-Time 2.3 लाइब्रेरी का उपयोग करके दिया गया है। बहुत आसान।

जैसा कि उदाहरण कोड में बताया गया है, मेरा सुझाव है कि आप जहां भी संभव हो नामांकित क्षेत्रों का उपयोग करें ताकि आपकी प्रोग्रामिंग डेलाइट सेविंग टाइम (डीएसटी) और अन्य विसंगतियों को संभाल सके ।

यदि आपने Tएक जगह के बजाय अपने स्ट्रिंग के बीच में रखा था , तो आप स्ट्रिंग को पार्स करने के लिए एक फॉर्मेटर के साथ काम करते हुए, कोड की पहली दो पंक्तियों को छोड़ सकते हैं। दिनांक समय निर्माता में एक स्ट्रिंग ले जा सकते हैं आईएसओ 8601 प्रारूप।

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

// Parse string as a date-time in UTC (no time zone offset).
DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss" );
DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( "2011-10-06 03:35:05" );

// Adjust for 13 hour offset from UTC/GMT.
DateTimeZone offsetThirteen = DateTimeZone.forOffsetHours( 13 );
DateTime thirteenDateTime = dateTimeInUTC.toDateTime( offsetThirteen );

// Hard-coded offsets should be avoided. Better to use a desired time zone for handling Daylight Saving Time (DST) and other anomalies.
// Time Zone list… http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZoneTongatapu = DateTimeZone.forID( "Pacific/Tongatapu" );
DateTime tongatapuDateTime = dateTimeInUTC.toDateTime( timeZoneTongatapu );

उन मूल्यों को डंप करें ...

System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "thirteenDateTime: " + thirteenDateTime );
System.out.println( "tongatapuDateTime: " + tongatapuDateTime );

जब चला…

dateTimeInUTC: 2011-10-06T03:35:05.000Z
thirteenDateTime: 2011-10-06T16:35:05.000+13:00
tongatapuDateTime: 2011-10-06T16:35:05.000+13:00

2

सभी टाइमज़ोन के लिए दिनांक और समय प्रदर्शित करें

import java.util.Calendar;
import java.util.TimeZone;
import java.text.DateFormat;
import java.text.SimpleDateFormat;



static final String ISO8601 = "yyyy-MM-dd'T'HH:mm:ssZ";
DateFormat dateFormat = new SimpleDateFormat(ISO8601);
Calendar c = Calendar.getInstance();
String formattedTime;
for (String availableID : TimeZone.getAvailableIDs()) {
    dateFormat.setTimeZone(TimeZone.getTimeZone(availableID));
    formattedTime = dateFormat.format(c.getTime());
    System.out.println(formattedTime + " " + availableID);
}

1

हम दिए गए दिनांक से UTC / GMT समय टिकट प्राप्त कर सकते हैं।

/**
 * Get the time stamp in GMT/UTC by passing the valid time (dd-MM-yyyy HH:mm:ss)
 */
public static long getGMTTimeStampFromDate(String datetime) {
    long timeStamp = 0;
    Date localTime = new Date();

    String format = "dd-MM-yyyy HH:mm:ss";
    SimpleDateFormat sdfLocalFormat = new SimpleDateFormat(format);
    sdfLocalFormat.setTimeZone(TimeZone.getDefault());

    try {

        localTime = (Date) sdfLocalFormat.parse(datetime); 

        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
                Locale.getDefault());
        TimeZone tz = cal.getTimeZone();

        cal.setTime(localTime);

        timeStamp = (localTime.getTime()/1000);
        Log.d("GMT TimeStamp: ", " Date TimegmtTime: " + datetime
                + ", GMT TimeStamp : " + localTime.getTime());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return timeStamp;

}

यह पारित तिथि के आधार पर यूटीसी समय लौटाएगा।

  • हम UTC टाइम स्टांप की तरह वर्तमान तारीख और समय के विपरीत कर सकते हैं (इसके विपरीत)

        public static String getLocalTimeFromGMT(long gmtTimeStamp) {
                 try{
                        Calendar calendar = Calendar.getInstance();
                        TimeZone tz = TimeZone.getDefault();
                        calendar.setTimeInMillis(gmtTimeStamp * 1000);
        //              calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis())); 
                        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                        Date currenTimeZone = (Date) calendar.getTime();
                        return sdf.format(currenTimeZone);
                    }catch (Exception e) {
                    }
                    return "";  
                }
    

मुझे उम्मीद है कि इससे दूसरों को मदद मिलेगी। धन्यवाद!!


1

एक त्वरित तरीका है:

String dateText ="Thu, 02 Jul 2015 21:51:46";
long hours = -5; // time difference between places

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(E, dd MMM yyyy HH:mm:ss, Locale.ENGLISH);     
LocalDateTime date = LocalDateTime.parse(dateText, formatter);        
date = date.with(date.plusHours(hours));

System.out.println("NEW DATE: "+date);

उत्पादन

नई तिथि: 2015-07-02T16: 51: 46


1

आपका दृष्टिकोण बिना किसी संशोधन के काम करता है।

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
// Timestamp for 2011-10-06 03:35:05 GMT
calendar.setTime(new Date(1317872105000L));

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));

// Prints 2011-10-06 16:35:05 GMT+13:00
System.out.println(formatter.format(calendar.getTime()));

1
public Timestamp convertLocalTimeToServerDatetime(String dt,String timezone){

    String clientDnT = dt ;// "2017-06-01 07:20:00";
    try{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse(clientDnT);
    TimeZone tz = TimeZone.getTimeZone(timezone.trim()); // get time zone of user
    sdf.setTimeZone(tz);

    // Convert to servertime zone 
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    TimeZone tzInAmerica = TimeZone.getDefault();
    sdf1.setTimeZone(tzInAmerica);

    // assign date to date
    String serverDate = sdf1.format(date);

    // Convert to servertime zone to Timestamp
    Date date2 =  sdf.parse(serverDate);
    Timestamp tsm = new Timestamp(date2.getTime());
    return  tsm;
    }
    catch(Exception e){
        System.err.println(e);
    }

    return null;
}

कृपया दिनांक और ग्राहक समय-सारणी पास करें , फिर विधि सर्वर सर्वर टाइमस्टैम्प को .. जावास्क्रिप्ट के लिए var _timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; और जावा में TimeZone tz = TimeZone.getDefault(); tz.getID()
सौरव बर्मन

1

दो अलग-अलग समय क्षेत्र के साथ अवधि या समय अंतराल खोजने के लिए

import org.joda.time.{DateTime, Period, PeriodType}

val s1 = "2019-06-13T05:50:00-07:00"
val s2 = "2019-10-09T11:30:00+09:00"    

val period = new Period(DateTime.parse(s1), DateTime.parse(s2), PeriodType dayTime())

period.getDays
period.getMinutes
period.getHours

उत्पादन अवधि = P117DT13H40M

days = 117
minutes = 40
hours = 13

1

मुझे आधुनिक उत्तर प्रदान करना चाहिए।

आप वास्तव में एक जीएमटी ऑफसेट पर एक स्ट्रिंग से एक तिथि और समय को एक अलग जीएमटी ऑफसेट में और एक अलग प्रारूप में एक स्ट्रिंग से परिवर्तित नहीं करना चाहते हैं। बल्कि अपने कार्यक्रम में एक तात्कालिक (समय में एक बिंदु) उचित तिथि-समय वस्तु के रूप में रखें। केवल जब आपको स्ट्रिंग आउटपुट देने की आवश्यकता होती है, तो अपनी वस्तु को वांछित स्ट्रिंग में प्रारूपित करें।

java.time

पार्सिंग इनपुट

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

    String dateTimeString = "2011-10-06 03:35:05";
    Instant instant = LocalDateTime.parse(dateTimeString, formatter)
            .atOffset(ZoneOffset.UTC)
            .toInstant();

अधिकांश उद्देश्यों के Instantलिए समय में एक बिंदु के भंडारण के लिए एक अच्छा विकल्प है। यदि आपको यह स्पष्ट करने की आवश्यकता है कि जीएमटी से तारीख और समय आया था, तो OffsetDateTimeइसके बजाय उपयोग करें ।

परिवर्तित, स्वरूपण और मुद्रण उत्पादन

    ZoneId desiredZone = ZoneId.of("Pacific/Auckland");
    Locale desiredeLocale = Locale.forLanguageTag("en-NZ");
    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern(
            "dd MMM uuuu HH:mm:ss OOOO", desiredeLocale);

    ZonedDateTime desiredDateTime = instant.atZone(desiredZone);
    String result = desiredDateTime.format(desiredFormatter);
    System.out.println(result);

यह मुद्रित:

06 अक्टूबर 2011 16:35:05 GMT + 13: 00

मैंने आपके द्वारा उल्लिखित ऑफसेट के बजाय समय क्षेत्र प्रशांत / ऑकलैंड निर्दिष्ट किया, +13: 00। मैं समझ गया कि आप न्यूजीलैंड का समय चाहते हैं, और प्रशांत / ऑकलैंड बेहतर तरीके से पाठक को यह बताता है। समय क्षेत्र भी गर्मियों के समय (डीएसटी) को ध्यान में रखता है, इसलिए आपको इसे अपने स्वयं के कोड में (अधिकांश उद्देश्यों के लिए) लेने की आवश्यकता नहीं है।

चूंकि Octअंग्रेजी में है, इसलिए फ़ॉर्मेटर को एक स्पष्ट स्थान देना एक अच्छा विचार है। GMTस्थानीयकृत भी हो सकता है, लेकिन मुझे लगता है कि यह GMTसभी स्थानों में प्रिंट करता है।

OOOOप्रारूप पैटर्न में स्ट्रिंग ऑफसेट को प्रिंट करने का एक तरीका है, जो समय क्षेत्र संक्षिप्त नाम से प्रिंट करने की तुलना में एक बेहतर विचार हो सकता है zक्योंकि समय क्षेत्र संक्षिप्त रूप अक्सर अस्पष्ट होते हैं। यदि आप चाहते हैं NZDT(न्यूजीलैंड डेलाइट समय के लिए), zतो इसके बजाय वहाँ डाल दिया ।

आपके सवाल

मैं java.time में आधुनिक कक्षाओं के संबंध में आपके गिने हुए प्रश्नों का उत्तर दूंगा।

के लिए संभव है:

  1. किसी वस्तु पर समय निर्धारित करें

नहीं, आधुनिक कक्षाएं अपरिवर्तनीय हैं। आपको एक ऐसी वस्तु बनाने की ज़रूरत है जिसमें शुरू से ही वांछित तिथि और समय हो (इसमें थ्रेड सुरक्षा सहित कई फायदे हैं)।

  1. (संभवतः) प्रारंभिक समय स्टैम्प का टाइमजोन सेट करें

atZoneविधि है कि मैं कोड में उपयोग एक रिटर्न ZonedDateTimeनिर्दिष्ट समय क्षेत्र के साथ। अन्य तिथि-समय की कक्षाओं में एक समान विधि होती है, जिसे कभी-कभी कहा जाता है atZoneSameInstantया अन्य नाम।

  1. एक नया TimeZone के साथ समय टिकट प्रारूपित करें

Java.time के साथ एक नए समय क्षेत्र में परिवर्तित होने और स्वरूपण दो अलग-अलग चरणों में दिखाए गए हैं।

  1. नए टाइम ज़ोन समय के साथ एक स्ट्रिंग लौटें।

हाँ, वांछित समय क्षेत्र को दिखाए गए अनुसार और प्रारूप में रूपांतरित करें।

मैंने पाया कि कभी भी मैं इस तरह समय निर्धारित करने की कोशिश करता हूं:

calendar.setTime(new Date(1317816735000L));

स्थानीय मशीन के TimeZone का उपयोग किया जाता है। ऐसा क्यों है?

यह आपके सोचने का तरीका नहीं है, जो अच्छी तरह से पुराने वर्गों के साथ (कई) डिजाइन समस्याओं के एक जोड़े को दिखाने के लिए जाता है।

  • A Dateको समय क्षेत्र नहीं मिला है। केवल जब आप इसे प्रिंट करते हैं, तो इसका toStringतरीका आपके स्थानीय समय क्षेत्र को पकड़ लेता है और स्ट्रिंग को प्रस्तुत करने के लिए इसका उपयोग करता है। यह सच हैnew Date() भी है। इस व्यवहार ने पिछले 25 वर्षों में कई, कई प्रोग्रामरों को भ्रमित किया है।
  • A Calender को टाइम ज़ोन मिला है। जब आप करते हैं तो यह नहीं बदलता है calendar.setTime(new Date(1317816735000L));

संपर्क

Oracle ट्यूटोरियल: java.time का उपयोग करने के तरीके की व्याख्या करने का समय।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.