जावा में डेट में n घंटे जोड़ना?


136

मैं दिनांक ऑब्जेक्ट में n घंटे कैसे जोड़ूं? मुझे StackOverflow पर दिनों का उपयोग करते हुए एक और उदाहरण मिला, लेकिन फिर भी समझ में नहीं आता कि इसे घंटों के साथ कैसे किया जाए।


3
यदि संभव हो तो joda-time.sourceforge.net का उपयोग करें ।
बाबर

3
यदि संभव हो तो जावा 8 दिनांक और समय का उपयोग करें ।
peceps

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

जवाबों:


210

कैलेंडर वर्ग की जाँच करें। addसमय में हेरफेर करने की अनुमति देने के लिए इसकी विधि (और कुछ अन्य) हैं। कुछ इस तरह से काम करना चाहिए।

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

अधिक के लिए एपीआई की जाँच करें ।


4
यदि आप दिन के उजाले की बचत / गर्मी के समय से निपट रहे हैं तो सावधान रहें।
कर्टनडॉग

5
उल्लेख करने की आवश्यकता है कि आप "नकारात्मक घंटे" जोड़ सकते हैं
pramodc84

6
@CurtainDog का उपयोग करने से Calendar.add()स्वतः इसका ध्यान रखा जाता है।
जेसपर

6
cal.setTime (नई तिथि ()) की आवश्यकता नहीं है - Calendar.getInstance () का javadoc कहता है: "कैलेंडर लौटा डिफ़ॉल्ट समय क्षेत्र में डिफ़ॉल्ट लोकेल के साथ वर्तमान समय पर आधारित है।"
मिथ्रंदिर

FYI करें, पुरानी डेट-टाइम क्लासेस जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और जावा 9 में निर्मित जावा.टाइम क्लासेज द्वारा सप्लीमेंट किया गया है । Oracle द्वारा ट्यूटोरियल देखें ।
तुलसी बॉर्क

82

यदि आप Apache Commons / Lang का उपयोग करते हैं , तो आप इसका उपयोग करके एक चरण में कर सकते हैं DateUtils.addHours():

Date newDate = DateUtils.addHours(oldDate, 3);

(मूल वस्तु अपरिवर्तित है)


3
तुम भी negativ घंटे का उपयोग कर सकते हैं:DateUtils.addHours(oldDate, -1);
Kaptain

पर्दे के पीछे, यह वही करता है जो निकिता का जवाब है, लेकिन यह बहुत सरल और पढ़ने में आसान है। इसके अलावा, यदि आप पहले से ही अपाचे कॉमन्स / लैंग का उपयोग करते हैं ... तो क्यों नहीं?
मैट

28

@ क्रिस्टोफर के उदाहरण को सरल बनाने के लिए।

कहो कि आपके पास एक स्थिरांक है

public static final long HOUR = 3600*1000; // in milli-seconds.

तुम लिख सकते हो।

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

यदि आप डेट ऑब्जेक्ट के बजाय डेट / टाइम को स्टोर करने के लिए लंबे समय का उपयोग करते हैं तो आप कर सकते हैं

long newDate = oldDate + 2 * HOUR;

26

tl; डॉ

myJavaUtilDate.toInstant()
              .plusHours( 8 )

या ...

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

Java.time का उपयोग करना

जावा 8 में निर्मित java.time फ्रेमवर्क और बाद में पुराने Java.util.Date/.Calendar क्लासेस को दबा देता है। वे पुराने वर्ग कुख्यात हैं। इनसे बचें।

toInstantJava.util में नए जोड़े गए तरीके का उपयोग करें। पुराने प्रकार से नए java.time प्रकार में बदलने के लिए। एक Instantमें समय रेखा पर एक पल है यूटीसी के एक संकल्प के साथ नैनोसेकंड

Instant instant = myUtilDate.toInstant();

आप इस तरह Instantसे पास करके घंटों को जोड़ सकते हैं ।TemporalAmountDuration

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

उस दिनांक-समय को पढ़ने के लिए, मानक ISO 8601 प्रारूप में कॉल करके स्ट्रिंग उत्पन्न करें toString

String output = instantHourLater.toString();

आप किसी क्षेत्र की दीवार-घड़ी के समय के लेंस के माध्यम से उस क्षण को देखना चाहते हैं । एक Instantबनाकर अपने वांछित / अपेक्षित समय क्षेत्र में समायोजित करें ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

वैकल्पिक रूप से, आप plusHoursअपनी घंटों की संख्या को जोड़ने के लिए कॉल कर सकते हैं । ज़ोनड होने का मतलब है डेलाइट सेविंग टाइम (डीएसटी) और अन्य विसंगतियों को आपकी ओर से नियंत्रित किया जाएगा।

ZonedDateTime later = zdt.plusHours( 8 );

आप सहित पुराने तिथि-समय वर्गों का उपयोग करने से बचना चाहिए java.util.Dateऔर .Calendar। लेकिन अगर आपको वास्तव में java.util.Datejava.time प्रकारों के लिए अद्यतन नहीं की गई कक्षाओं के साथ इंटरऑपरेबिलिटी की आवश्यकता है , तो इसके ZonedDateTimeमाध्यम से कन्वर्ट करें Instant। पुराने वर्गों में जोड़े गए नए तरीके java.time प्रकार से / में रूपांतरण की सुविधा प्रदान करते हैं।

java.util.Date date = java.util.Date.from( later.toInstant() );

परिवर्तित करने के बारे में अधिक चर्चा के लिए, मेरे प्रश्न का उत्तर देखें , java.util में कनवर्ट करें। "java.time" प्रकार क्या है?


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

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

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

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

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तारों की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

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


23

साथ Joda समय

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

2
+1 इस के लिए थोड़ा अनावश्यक है, लेकिन अगर आप अधिक डेट हेरफेर करने जा रहे हैं, तो joda time एक बेहतरीन लाइब्रेरी है
जोएरी हेंड्रिकक्स

3
@JoeriHendrickx यदि प्रोग्रामर डेट में घंटों को जोड़ रहा है, तो बहुत संभव है कि वे अन्य डेट-टाइम काम कर रहे हों। मैं जोडा-टाइम को बिल्कुल भी अनावश्यक नहीं मानता ; पहली बात यह है कि किसी भी नए प्रोजेक्ट को स्थापित करते समय मैं जोडा-टाइम जोड़ रहा हूं। यहां तक ​​कि सन और ओरेकल इस बात पर सहमत हुए कि पुराने java.util.Date और कैलेंडर को चरणबद्ध करने की आवश्यकता है, इसलिए उन्होंने नया java.time जोड़ा । * पैकेज (जोडा-टाइम से प्रेरित) Java 8.
बेसिल बोर्क

मुझे एंड्रॉइड पर जोडा से परेशानी थी। रखा जा रहा हैClassNotDefinedException
TheRealChx101

23

जावा 8 के बाद से:

LocalDateTime.now().minusHours(1);

LocalDateTimeएपीआई देखें ।


4
बंद करें लेकिन काफी सही नहीं। आपको एक के ZonedDateTimeबजाय एक के लिए जाना चाहिए LocalDateTime। "स्थानीय" साधन नहीं किसी विशेष इलाके से बंधा है, और समय से बंधा। जैसे "क्रिसमस 25 दिसंबर, 2015 की आधी रात को शुरू होता है" विभिन्न समय क्षेत्रों में एक अलग पल है, जिसका कोई अर्थ नहीं है जब तक कि आप समय रेखा पर एक विशेष क्षण प्राप्त करने के लिए किसी विशेष समय क्षेत्र को लागू नहीं करते हैं। इसके अलावा, एक समय क्षेत्र डेलाइट सेविंग टाइम (डीएसटी) और अन्य विसंगतियों के बिना, लोकल टाइमटाइम के इस तरह के उपयोग से नियंत्रित नहीं किया जाएगा। तुलना करके मेरा उत्तर देखें ।
बेसिल बोर्क

1
इसके अलावा java.util.Dateऑब्जेक्ट प्राप्त करने के लिए, जैसा कि ZonedDateTime.toInstant()Date.from()
आवश्यककर्ता

16

Newish java.util.concurrent.TimeUnit क्लास का उपयोग करके आप इसे इस तरह कर सकते हैं

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

14

कुछ इस तरह:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

1
FYI करें, पुरानी डेट-टाइम क्लासेस जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और जावा 9 में निर्मित जावा.टाइम क्लासेज द्वारा सप्लीमेंट किया गया है । Oracle द्वारा ट्यूटोरियल देखें ।
तुलसी बॉर्क

7

जब आपकी Dateवस्तु डाटटाइम प्रारूप में होती है तो यह कोड का एक और टुकड़ा होता है। इस कोड की सुंदरता है, यदि आप अधिक संख्या में घंटे देते हैं तो तिथि भी उसी अनुसार अपडेट होगी।

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

यहाँ आउटपुट है:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014

1
आप यह भी उपयोग कर सकते हैं: कैलेंडर कैल = Calendar.getInstance ();
स्टीफन स्प्रेंजर

4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);

4

यदि आप उपयोग करने के लिए तैयार हैं java.time, तो यहां आईएसओ 8601 स्वरूपित अवधि जोड़ने की एक विधि दी गई है:

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  

1
Duration.parse(iso8601duration)दिलचस्प है, धन्यवाद, लेकिन आप ऑपरेटर का उपयोग नहीं कर सकता है +पर LocalDateTime, आप संपादित करने के लिए है कि कर सकते हैं। लेकिन .plus(...)काम करता है।
qlown

धन्यवाद @qlown, मुझे लगता है कि + ग्रूवी में काम कर रहा है क्योंकि मैं इसे अभी उपयोग कर रहा हूं। मैं तदनुसार उत्तर संशोधित करूंगा।
डैनियल

प्रश्न एक Dateवस्तु के बारे में है, जो यूटीसी में एक विशिष्ट क्षण का प्रतिनिधित्व करता है। LocalDateTimeप्रश्न को संबोधित करने में आपका उपयोग विफल रहता है। LocalDateTimeसमय क्षेत्र या ऑफसेट-यूटीसी से किसी भी अवधारणा का अभाव है, और इसलिए एक पल का प्रतिनिधित्व नहीं कर सकता है। इस समस्या के लिए गलत वर्ग। देखें कि इंस्टेंट और लोकल डेटाइम में क्या अंतर है?
तुलसी बॉर्क

@BasilBourque Dateऑब्जेक्ट को हटा दिया गया है। सवाल अस्पष्ट है जब यह समय क्षेत्र की बात आती है तो मेरे जवाब खड़े हो जाते हैं। इसके अलावा, आप बस के LocalDateTimeलिए बाहर स्वैप कर सकते हैं ZonedDateTime
डैनियल

4

आप इसे Joda DateTime एपीआई के साथ कर सकते हैं

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

कार्य करने के बाद मैंने पहली पंक्ति को डेटटाइम डेटटाइम = नए डेटटाइम (डेटऑबज) में बदल दिया;
सुंदरराज गोविंदसामी ar

1

जावा 8 कक्षाओं का उपयोग करके। हम दिनांक और समय को बहुत आसानी से नीचे के रूप में जोड़ सकते हैं।

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

प्रश्न एक Dateवस्तु के बारे में है, जो यूटीसी में एक विशिष्ट क्षण का प्रतिनिधित्व करता है। LocalDateTimeप्रश्न को संबोधित करने में आपका उपयोग विफल रहता है। LocalDateTimeसमय क्षेत्र या ऑफसेट-यूटीसी से किसी भी अवधारणा का अभाव है, और इसलिए एक पल का प्रतिनिधित्व नहीं कर सकता है। इस समस्या के लिए गलत वर्ग। देखें कि इंस्टेंट और लोकल डेटाइम में क्या अंतर है?
तुलसी बोर्के

0

आप Java 8 से लोकलडेट टाइम का उपयोग कर सकते हैं। उदाहरण के लिए:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

प्रश्न एक Dateवस्तु के बारे में है, जो यूटीसी में एक विशिष्ट क्षण का प्रतिनिधित्व करता है। LocalDateTimeप्रश्न को संबोधित करने में आपका उपयोग विफल रहता है। LocalDateTimeसमय क्षेत्र या ऑफसेट-यूटीसी से किसी भी अवधारणा का अभाव है, और इसलिए एक पल का प्रतिनिधित्व नहीं कर सकता है। इस समस्या के लिए गलत वर्ग। देखें कि इंस्टेंट और लोकल डेटाइम में क्या अंतर है?
तुलसी बोर्के

-1

आप इस विधि का उपयोग कर सकते हैं, इसे समझना और कार्यान्वित करना आसान है:

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}

यह दृष्टिकोण वर्षों पहले पोस्ट किए गए एक अन्य उत्तर में प्रस्तुत किया गया है। मैं यह नहीं देखता कि यह कोई और मूल्य कैसे जोड़ता है।
तुलसी बॉर्क

मेरे प्रस्ताव का जोड़ा मूल्य सरलता और कार्यान्वयन में आसानी है, उपयोगकर्ता को बस इसे पेस्ट करना है और इसका उपयोग करना है और घंटे, मिनट या सेकंड जोड़ना है, जैसा कि आप जानते हैं, शुरुआती स्तर भिन्न होता है और यदि प्रस्तावित उत्तर सरल उत्तरों के बीच संयोजित होते हैं और उन्नत जवाब यह प्रशंसनीय होगा :)
निंपो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.