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!

আমি অ্যাপেনজিন ব্যবহার করছি। এটি কি অ্যাপেনজিন বাগ, সমস্যা বা অন্য কোনও সমস্যা? বা এটি অন্য কিছু উপর নির্ভর করে?


এটির সাথে বিভিন্ন লোকেলগুলির সাথে কিছু করার আছে বা একই পিসি থেকে সারাক্ষণ ঘটে?
লস্টবয়

এটি অ্যাপেনজিনে স্থাপন করার সময় ঘটে।
অ্যাডেলিন

: বন্ধ সময় কাটার অন্যান্য সমাধানের প্রচুর stackoverflow.com/a/1908955/2646526
heenenee

অবগতির জন্য, যেমন বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted 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 ব্যবহার করে (এএম / প্রধানমন্ত্রী ব্যবহারের জন্য), এবং Calendar.HOUR_OF_DAY0-23 ব্যবহার করে।

জাভাদোকদের উদ্ধৃতি দিতে:

সর্বজনীন স্থিতিশীল চূড়ান্ত int ঘন্টা OUR

পেতে এবং সেট করার জন্য ক্ষেত্রের নম্বরটি সকাল বা বিকেলের সময় নির্দেশ করে। HOUR টি 12-ঘন্টা ঘড়ির জন্য ব্যবহৃত হয় (0 - 11) দুপুর এবং মধ্যরাত 0 দ্বারা প্রতিনিধিত্ব করা হয়, 12 দ্বারা নয়, উদাহরণস্বরূপ, 10: 04: 15.250 এ পিএম ঘন্টা হ'ল 10।

এবং

সর্বজনীন স্থিতিশীল চূড়ান্ত পূর্ববর্তী HOUR_OF_DAY

দিনের ঘন্টা নির্দেশ করে পেতে এবং সেট করার জন্য ক্ষেত্রের নম্বর। HOUR_OF_DAY 24 ঘন্টা ঘড়ির জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, 10: 04: 15.250 অপরাহ্ন এ HOUR_OF_DAY 22 হয়।

পরীক্ষার ("এখন" সিটি 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
@ জারোডরোবারসন কিন্তু ব্যবহার করে Calendar.HOURপ্রধানমন্ত্রীকে দুপুরের ১২ টা নাগাদ এএমইএম সেট করতে হবে না।
rgettman

আপনি কি আমাকে ঘন্টা, মিনিট এবং দ্বিতীয় দিয়ে স্থানীয় তারিখ তৈরিতে সহায়তা করতে পারেন? আমি জানি একটি বিকল্প ডেটটাইম অনুসরণ করা ime
উডি

11
যে কেউ HOUR এবং HOUR_OF_DAY ফিল্ডটি তৈরি করেছে তাকে চাবুক মারতে হবে এবং রেশন করা উচিত ছিল।
অ্যান্ড্রয়েড ডেভ

1
@ অ্যান্ড্রয়েডদেব যে কেউ সকাল / সন্ধ্যা আবিষ্কার করেছেন সে একই প্রাপ্য ... এটি নন-মেট্রিক মানগুলির জন্যও যায়
উত্সর্গীকৃত

1
অবগতির জন্য, যেমন বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 & জাভা 9. দেখুন পাতাটা শ্রেণীর ওরাকল দ্বারা টিউটোরিয়াল
তুলিল বাউরক

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এটির জন্য ব্যবহার করা ঠিক ভুল শ্রেণি class এটি কোনও মুহুর্তের প্রতিনিধিত্ব করতে পারে না কারণ এতে সময় অঞ্চল বা ইউটিসির অফসেটের কোনও ধারণার অভাব রয়েছে। কল করা 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 = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

তারপরে আপনি "মিলি সেকেন্ড" সময়টি 0 মিলিসেকেন্ডটি ফরমেটারে পাস করে পেতে পারেন:

String time = dateFormat.format(0);

অথবা আপনি তারিখ অবজেক্ট তৈরি করতে পারেন:

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

অথবা আপনি ক্যালেন্ডার উপাদান ব্যবহার করে আরও বেশি সম্ভাবনা অর্জন করতে সক্ষম হন তবে আপনার ক্যালেন্ডারের উদাহরণ হিসাবে GMT হিসাবে সময় অঞ্চল সেট করা উচিত:

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 এ সংজ্ঞায়িত আধুনিক জাভা.টাইম ক্লাসগুলি দ্বারা বছর পূর্বে ভয়ানক পুরানো তারিখের সময় ক্লাসগুলি ব্যবহার করছেন ।

DateInstant

একটি java.util.Dateইউটিসিতে একটি মুহুর্ত উপস্থাপন করে। এর প্রতিস্থাপন হয় Instant। পুরানো ক্লাসগুলিতে যুক্ত হওয়া নতুন রূপান্তর পদ্ধতিগুলিকে কল করুন।

Instant instant = myJavaUtilDate.toInstant() ;

সময় অঞ্চল

যে সময় অঞ্চলটি আপনি নিজের নতুন সময়ের কথাটি বোঝাতে চান তা উল্লেখ করুন।

একটি নির্দিষ্ট করুন সঠিক সময় অঞ্চল নাম এর বিন্যাসে Continent/Regionযেমন America/Montreal, Africa/Casablancaঅথবা Pacific/Auckland। কখনও যেমন 2-4 চিঠি সংক্ষেপ ব্যবহার ESTবা ISTহিসাবে তারা না সত্য সময় অঞ্চল, না মান, এবং এমনকি অনন্য নয় (!)।

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

ZonedDateTime

প্রয়োগ ZoneIdকরার জন্য Instantএকটি পেতে ZonedDateTime। একই মুহুর্ত, সময়রেখায় একই পয়েন্ট, তবে বিভিন্ন দেয়াল-ঘড়ির সময়।

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 এ শুরু হয় না। তারা অন্য সময়ে শুরু হতে পারে যেমন ডাইলাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলির কারণে 01:00:00।

জাভা.টাইম প্রথম মুহুর্তটি নির্ধারণ করুক । কেবলমাত্র তারিখের অংশটি বের করুন। তারপরে প্রথম মুহুর্তটি পেতে সময় অঞ্চলটি পাস করুন।

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

ইউটিসিতে সামঞ্জস্য করুন

আপনার যদি ইউটিসি-তে ফিরে যেতে হয় তবে একটিটি বের করুন Instant

Instant instant = zdtFirstMomentOfDay.toInstant() ;

InstantDate

আপনার যদি java.util.Dateপুরানো কোডটি এখনও জাভা.টাইমে আপডেট না করে ইন্টারঅ্যাপের প্রয়োজন হয় তবে রূপান্তর করুন।

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

1

এটি করা সহজ হতে পারে (জাভা 8)

LocalTime.ofNanoOfDay(0)

ধন্যবাদ, আমি গত 2 বছর অন্যান্য জিনিস এবং এর আগে জাভা 6/7 নিয়ে কাজ করেছি। আমি এখন জাভাতে ফিরে এসেছি (গ্রোভির কয়েকটি জিনিস নিয়ে কাজ করার পরে) এবং জাভা ৮ টি পার্থক্য পছন্দ করছি।
মেসজিয়াস

1

আমরা সেট করতে পারেন java.util.Date সময় অংশ 00:00:00 এর LOCALDATE বর্গ ব্যবহারের জাভা 8 / Joda-DATETIME API :

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 ফর্ম্যাটের প্রয়োজন হয় তবে আপনার নীচের মতো সিম্পলডেট ফরমেট ব্যবহার করা উচিত। "এইচ" পরিবর্তে "এইচ" ব্যবহার করা হচ্ছে।

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

এটি করার আরেকটি উপায় হ'ল কোনও সেকেন্ড ছাড়াই একটি ডেটফরম্যাট ব্যবহার করা:

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

জাভা 8 নতুন তারিখ ফাংশন যুক্ত করার ফলে আমরা এটি সহজেই করতে পারি।


    // 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পরিবর্তে আপনি ব্যবহার করা উচিত ।
বাসিল বাউরক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.