00:00:00 बजे का समय निर्धारित करें


121

मुझे जावा में घंटे रीसेट करने में समस्या है। दी गई तारीख के लिए मैं घंटे को 00:00:00 बजे सेट करना चाहता हूं।

यह मेरा कोड है:

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }

समस्या यह है कि कभी-कभी समय होता है 12:00:00और कभी-कभी ऐसा होता है 00:00:00और जब मैं उस निकाय के लिए डेटाबेस की क्वेरी करता हूं, जिसे सहेजा गया था 07.02.2013 00:00:00और वास्तविक इकाई समय, जो संग्रहीत है 12:00:00, क्वेरी विफल है।

मुझे पता है कि 12:00:00 == 00:00:00!

मैं AppEngine का उपयोग कर रहा हूँ। क्या यह एक एपेंगिन बग, समस्या या कुछ अन्य मुद्दा है? या यह किसी और चीज़ पर निर्भर करता है?


यह विभिन्न स्थानों के साथ कुछ करने के लिए हो सकता है या यह एक ही पीसी से हर समय होता है?
लॉस्टबॉय

यह तब होता है जब मैं एपेंगी पर तैनात होता हूं।
एडेलिन

समय काटने के लिए अन्य समाधान के बहुत सारे: stackoverflow.com/a/1908955/2646526
हेनेनी

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

1
मैंने calendar.set(Calendar.HOUR_OF_DAY, 0);अपने उद्देश्य के लिए इस्तेमाल किया , यह अच्छी तरह से काम करता है।
हरिप्रसाद

जवाबों:


209

के बजाय एक और निरंतर का Calendar.HOURउपयोग करें Calendar.HOUR_OF_DAY

calendar.set(Calendar.HOUR_OF_DAY, 0);

Calendar.HOUR0-11 (AM / PM के साथ उपयोग के लिए) का Calendar.HOUR_OF_DAYउपयोग करता है , और 0-23 का उपयोग करता है।

Javadocs बोली करने के लिए:

सार्वजनिक स्थैतिक अंतिम इंट

सुबह या दोपहर के समय को इंगित करने और सेट करने के लिए फ़ील्ड संख्या। हूर का उपयोग 12-घंटे की घड़ी (0 - 11) के लिए किया जाता है। दोपहर और आधी रात को 0 से दर्शाया जाता है, 12 से नहीं। जैसे, 10: 04: 15.250 बजे द हॉर 10 है।

तथा

सार्वजनिक स्थैतिक अंतिम int HOUR_OF_DAY

दिन के घंटे को इंगित करने और सेट करने के लिए फ़ील्ड संख्या। HOUR_OF_DAY का उपयोग 24-घंटे की घड़ी के लिए किया जाता है। जैसे, 10: 04: 15.250 बजे HOUR_OF_DAY 22 है।

परीक्षण ("अभी" वर्तमान में c है। 14:55 23 जुलाई, 2013 प्रशांत प्रशांत समय पर):

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}

आउटपुट:

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00

3
@JarrodRoberson लेकिन इसका उपयोग Calendar.HOURPM को AM पर सेट करने में नहीं होगा, इसे दोपहर 12:00 बजे छोड़ दिया जाएगा।
rgettman

क्या आप कृपया घंटे, मिनट और सेकंड के साथ लोकलडेट बनाने में मेरी मदद कर सकते हैं? मुझे पता है कि DateTime का अनुसरण करने के लिए एक विकल्प है।
वुडी

11
जिसने भी HOUR और HOUR_OF_DAY को फ़ील्ड बनाया है, उसे फ़ेल कर राशन देना चाहिए था।
AndroidDev

1
@AndroidDev जिसने भी सुबह / दोपहर का आविष्कार किया, वही इसका हकदार है ... यह गैर-मीट्रिक मानकों के लिए भी जाता है
Dediqated

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

29

java.time

java.timeजावा 8 और बाद में निर्मित ढांचे का उपयोग करना । ट्यूटोरियल देखें ।

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

यदि आपको दिन के समय (घंटे, मिनट, दूसरे आदि भागों) की आवश्यकता नहीं है, तो LocalDateकक्षा का उपयोग करने पर विचार करें ।

LocalDate.now(); # 2015-11-19

जावा 1.8 को जारी किए जाने के बाद से यह नया स्वीकृत उत्तर होना चाहिए क्योंकि यह प्रश्न पहले पूछा गया था।
मैट फोर्सेथे

LocalDateTimeइसके लिए उपयोग करने के लिए बिल्कुल गलत वर्ग है। यह एक क्षण का प्रतिनिधित्व नहीं कर सकता क्योंकि इसमें समय क्षेत्र या ऑफसेट-यूटीसी की किसी भी अवधारणा का अभाव है। LocalDateTime.nowलगभग कभी भी फोन करने का कोई मतलब नहीं है। ZonedDateTimeइसके बजाय उपयोग करें । अन्यथा आप महत्वपूर्ण समय क्षेत्र के मुद्दों की अनदेखी कर रहे हैं। एक बात के लिए, कुछ क्षेत्रों में कुछ तिथियां 00:00 बजे शुरू नहीं होती हैं !
बेसिल बोर्के

12

यहाँ कुछ उपयोगिता फ़ंक्शंस हैं जो मैं बस यही करने के लिए उपयोग करता हूं।

/**
 * sets all the time related fields to ZERO!
 *
 * @param date
 *
 * @return Date with hours, minutes, seconds and ms set to ZERO!
 */
public static Date zeroTime( final Date date )
{
    return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}

/**
 * Set the time of the given Date
 *
 * @param date
 * @param hourOfDay
 * @param minute
 * @param second
 * @param ms
 *
 * @return new instance of java.util.Date with the time set
 */
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
    gc.set( Calendar.MINUTE, minute );
    gc.set( Calendar.SECOND, second );
    gc.set( Calendar.MILLISECOND, ms );
    return gc.getTime();
}

6

एक और जावा 8 रास्ता:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

लेकिन यह उस तारीख को संपादित करने के लिए बहुत अधिक उपयोगी है जो पहले से मौजूद है।


1
LocalDateTimeएक पल का प्रतिनिधित्व नहीं कर सकता, क्योंकि इसमें समय क्षेत्र या ऑफसेट-यूटीसी की किसी भी अवधारणा का अभाव है। LocalDateTime.nowलगभग कभी भी फोन करने का कोई मतलब नहीं है। आपको ZonedDateTimeइसके बजाय उपयोग करना चाहिए ।
तुलसी बॉर्क

3

आप मुख्य रूप से इस तरह DateFormat घटक के लिए समय क्षेत्र निर्धारित करना बेहतर होगा:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

फिर आप फॉर्मेट करने के लिए 0 मिलीसेकंड पास करके "00:00:00" समय प्राप्त कर सकते हैं:

String time = dateFormat.format(0);

या आप दिनांक ऑब्जेक्ट बना सकते हैं:

Date date = new Date(0); // also pass milliseconds
String time = dateFormat.foramt(date);

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

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 37);
calendar.set(Calendar.SECOND, 27);

dateFormat.format(calendar.getTime());

2

tl; डॉ

myJavaUtilDate                                 // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant()                                   // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) )         // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate()                                 // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )   // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.

java.time

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

DateInstant

एक java.util.Dateयूटीसी में एक पल का प्रतिनिधित्व करते हैं। इसका प्रतिस्थापन है Instant। पुरानी कक्षाओं में जोड़े गए नए रूपांतरण तरीकों को कॉल करें।

Instant instant = myJavaUtilDate.toInstant() ;

समय क्षेत्र

उस समय क्षेत्र को निर्दिष्ट करें, जिसमें आप अपना नया समय बनाना चाहते हैं।

के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 2-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

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

ZonedDateTime

पाने के ZoneIdलिए आवेदन करें । एक ही क्षण, समय पर एक ही बिंदु, लेकिन अलग-अलग दीवार-घड़ी का समय।InstantZonedDateTime

ZonedDateTime zdt = instant.atZone( z ) ;

दिन का समय बदलना

आपने समय बदलने के लिए कहा। LocalTimeदिन के सभी भागों को बदलने के लिए एक लागू करें : घंटा, मिनट, दूसरा, आंशिक दूसरा। ZonedDateTimeमूल के आधार पर मूल्यों के साथ एक नया त्वरित किया जाता है। Java.time कक्षाएं इस का उपयोग अपरिवर्तनीय वस्तुओं पैटर्न प्रदान करने के लिए धागे की सुरक्षा

LocalTime lt = LocalTime.of( 15 , 30 ) ;  // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ; 

दिन का पहला क्षण

लेकिन आपने विशेष रूप से 00:00 के लिए पूछा। तो जाहिर है आप दिन का पहला क्षण चाहते हैं। खबरदार: कुछ क्षेत्रों में कुछ दिन 00:00:00 बजे शुरू नहीं होते हैं। वे डेलाइट सेविंग टाइम (DST) जैसी विसंगतियों के कारण 01:00:00 जैसे किसी अन्य समय पर शुरू कर सकते हैं।

Java.time को पहले क्षण का निर्धारण करने दें । दिनांक-केवल भाग निकालें। फिर पहले क्षण प्राप्त करने के लिए टाइम ज़ोन पास करें।

LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;

UTC में समायोजित करें

यदि आपको यूटीसी पर वापस जाने की आवश्यकता है, तो एक निकालें Instant

Instant instant = zdtFirstMomentOfDay.toInstant() ;

InstantDate

अगर आपको java.time मेंjava.util.Date अभी तक अपडेट नहीं किए गए पुराने कोड के साथ हस्तक्षेप करने की आवश्यकता है , तो कनवर्ट करें।

java.util.Date d = java.util.Date.from( instant ) ;

1

ऐसा करना आसान हो सकता है (जावा 8 में)

LocalTime.ofNanoOfDay(0)

धन्यवाद, मैंने पिछले 2 वर्षों में अन्य सामान के साथ काम किया, और इससे पहले जावा 6/7। मैं अब जावा में वापस आ गया हूं (ग्रूवी पर कुछ चीजों के साथ काम करने के बाद) और जावा 8 मतभेदों को पसंद कर रहा हूं।
19

1

हम java.util को सेट कर सकते हैं। समय भाग 00:00:00 पर जावा 8 / Joda-datetime के स्थानीय स्तर का उपयोग करके :

Date datewithTime = new Date() ; // ex: Sat Apr 21 01:30:44 IST 2018
LocalDate localDate = LocalDate.fromDateFields(datewithTime);
Date datewithoutTime = localDate.toDate(); // Sat Apr 21 00:00:00 IST 2018

1

यदि आपको स्ट्रिंग में 00:00:00 प्रारूप की आवश्यकता है, तो आपको नीचे दिए गए अनुसार SimpleDateFormat का उपयोग करना चाहिए। "एच" के बजाय "एच" का उपयोग करना।

Date today = new Date();
SimpleDateFormat ft = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
//not SimpleDateFormat("dd-MM-yyyy hh:mm:ss")
Calendar calendarDM = Calendar.getInstance();
calendarDM.setTime(today);
calendarDM.set(Calendar.HOUR, 0);
calendarDM.set(Calendar.MINUTE, 0);
calendarDM.set(Calendar.SECOND, 0);
System.out.println("Current Date: " + ft.format(calendarDM.getTime()));

//Result is: Current Date: 29-10-2018 00:00:00

0

ऐसा करने का एक और तरीका बिना किसी सेकंड के DateFormat का उपयोग करना होगा:

public static Date trim(Date date) {
    DateFormat format = new SimpleDateFormat("dd.MM.yyyy");
    Date trimmed = null;
    try {
        trimmed = format.parse(format.format(date));
    } catch (ParseException e) {} // will never happen
    return trimmed;
}

0

आप निम्न में से ऐसा कर सकते हैं:

Calendar cal = Calendar.getInstance();
cal.set(year, month, dayOfMonth, 0, 0, 0);
Date date = cal.getTime();

0

जैसा कि Java8 नए दिनांक कार्यों को जोड़ता है, हम इसे आसानी से कर सकते हैं।


    // If you have instant, then:
    Instant instant1 = Instant.now();
    Instant day1 = instant1.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day1); //2019-01-14T00:00:00Z

    // If you have Date, then:
    Date date = new Date();
    Instant instant2 = date.toInstant();
    Instant day2 = instant2.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day2); //2019-01-14T00:00:00Z

    // If you have LocalDateTime, then:
    LocalDateTime dateTime = LocalDateTime.now();
    LocalDateTime day3 = dateTime.truncatedTo(ChronoUnit.DAYS);
    System.out.println(day3); //2019-01-14T00:00
    String format = day3.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    System.out.println(format);//2019-01-14T00:00:00


LocalDateTimeएक पल का प्रतिनिधित्व नहीं कर सकता, क्योंकि इसमें समय क्षेत्र या ऑफसेट-यूटीसी की किसी भी अवधारणा का अभाव है। LocalDateTime.nowलगभग कभी भी फोन करने का कोई मतलब नहीं है। आपको ZonedDateTimeइसके बजाय उपयोग करना चाहिए ।
बेसिल बॉर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.