আজ মধ্যরাত এবং আগামীকাল মধ্যরাতের জাভা ডেট অবজেক্টটি কীভাবে তৈরি করবেন?


178

আমার কোডে আমার আজ যা ঘটেছিল তার সবগুলি সন্ধান করা দরকার। সুতরাং আজকের তারিখগুলির সাথে আমার তুলনা করা প্রয়োজন আজ সকাল ১০:০০ (এই ভোরে মধ্যরাত) থেকে রাত 12:00 (আজ রাত্রে)

আমি জানি ...

Date today = new Date(); 

... এখনই আমাকে পেয়ে যায়। এবং ...

Date beginning = new Date(0);

... আমাকে জানুয়ারী 1, 1970 এ শূন্য সময় পেয়েছে। তবে আজ শূন্য সময় এবং আগামীকাল শূন্য সময় পাওয়ার সহজ উপায় কী?

হালনাগাদ; আমি এটি করেছি, তবে অবশ্যই এর চেয়ে সহজ উপায় আছে?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
আমার মতে জোদা সময় আরও সহজ, আমার উত্তরটির শেষে দেখুন। আপনি যদি java.util. তারিখ / ক্যালেন্ডারটি ব্যবহার করতে চান তবে আপনাকে এটি করার সহজ উপায় নেই।
তিমাসশেও

পুনরায়: জোদা-সময় ব্যবহার করার জন্য টিমাসছা মন্তব্য করুন, জেনে নিন যে জোদা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে এবং জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশনের পরামর্শ দেয়।
তুলিল বাউরক

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

2
এই প্রশ্নের হিসাবে একটি প্রশ্নের এতগুলি ত্রুটিযুক্ত উত্তর খুব কমই দেখা খুব কমই। আমি বাসিল বাউরকের উত্তরটি প্রস্তাব করছি , এটি সঠিক এবং বুদ্ধিমান।
ওলে ভিভি

উত্তর:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

জেডিকে 8 - জাভা.টাইম.লোকালটাইম এবং জাভা.টাইম.লোকাল ডেট

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-টাইম

আপনি যদি জেডিকে <8 ব্যবহার করে থাকেন তবে আমি জোদা সময়ের প্রস্তাব দিচ্ছি , কারণ এপিআই সত্যই দুর্দান্ত:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

যেহেতু জোদা সময়ের ২.৩ সংস্করণটি অবচিতDateMidnight করা হয়েছে , সুতরাং এটি ব্যবহার করুন:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

আপনি যদি জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চল না চান তবে একটি সময় অঞ্চল পাস করুন।

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

সহায়তার জন্য ধন্যবাদ, আমি কীভাবে বর্তমানে এটি করছি তার সাথে আমি আমার মূল প্রশ্নটি আপডেট করেছি। পরামর্শের জন্য ধন্যবাদ.

3
জোদাটাইম ২.৩ অনুসারে, হ্রাস toDateMidnightকরা হয়েছে। বিশদগুলির জন্য এই উত্তরটি দেখুন: stackoverflow.com/a/19048833/363573
স্টিফান

JDK 8 এর জন্য একটি সমাধান যুক্ত করেছে
জেডিকে টিমশোহে 18'15

1
@ টিমাসচু সাধারণত সঠিক হওয়ার পরে, ZonedDateTimeআপনি জোদা-সময় বিভাগে যেমন করেছেন তেমন জোনড ডেট-টাইম মান ( ) ব্যবহার করে জাভা.টাইম করার পরামর্শ দিচ্ছি । Local…তাদের সমগ্র উদ্দেশ্য / উপেক্ষা সব অফসেট এবং সময় জোন বিবরণ যে, কোন হারান - ধরনের কোনও সময় জোনের তথ্য নেই। বিশেষত প্রশ্নটি তুলনা করার জন্য এই মানগুলি ব্যবহার করার বিষয়ে কথা বলেছে (সম্ভবত ডাটাবেস প্রশ্নগুলি?), একটি জোনেড তারিখের সময় মানটি আরও কার্যকর হতে পারে।
বেসিল বাউরক

1
@ অমলগোভিনাস ক্যালেন্ডার সেট করা নিশ্চিত করুন H HOUR_OF_DAY, ক্যালেন্ডার নয় H HOUR।
ওসওয়াল্ড

42

সম্পূর্ণতার জন্য, যদি আপনি ব্যবহার করছেন are জাভা 8 ব্যবহার করেন truncatedToতবে Instantআপনি ইউটিসিতে মধ্যরাত পাওয়ার জন্য ক্লাসের পদ্ধতিটিও ব্যবহার করতে পারেন ।

Instant.now().truncatedTo(ChronoUnit.DAYS);

যেমন জাভাদোক লিখিত

উদাহরণস্বরূপ, MINUTES ইউনিট দিয়ে কাটাটি সেকেন্ড এবং ন্যানোসেকেন্ডগুলি শূন্যে সেট করে নিকটতম মিনিটে চলে যাবে।

আশা করি এটা সাহায্য করবে.


1
ইঙ্গিতটির জন্য ধন্যবাদ। নির্দিষ্ট সময় অঞ্চলে মধ্যরাত পাওয়া দীর্ঘতর হয়:Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
ভাদজিম


33

মধ্যরাতের সন্ধানের সবচেয়ে সহজ উপায়:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

পরবর্তী দিন:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

আমি সেই কোডটি চালিয়েছি এবং পেয়েছি: মধ্যরাত: থু নভেম্বর 01 19:00:00 সিডিটি 2012
ডেভ

3
আপনি যদি সিস্টেম.আউট.প্রিন্ট (তারিখ) এর মতো কিছু করেন তবে সিস্টেমটি তারিখটি সিস্টেম টাইম জোনে (সিডিটি) রূপান্তর করে। সিডিটিতে সন্ধ্যা সাতটায় জিএমটিতে মধ্যরাত is আপনার যদি একটি নির্বাচিত সময় জোনে মধ্যরাতের প্রয়োজন হয়, আপনাকে ডিএসটি ધ્યાનમાં রেখে এই টাইম জোনের অফসেট যুক্ত করতে হবে।
আন্দ্রে ভলগিন

@ বাউনার এটি আপনি কোন পদ্ধতিটি ব্যবহার না করেই পৃথিবীতে অনেকগুলি 'মধ্যরাত' সময় রয়েছে তবে জাভা মধ্যরাত কেবলমাত্র একটি one
আন্দ্রে ভলগিন

2
@ আন্দ্রেই ভলগিন জানেন না যে "জাভা মধ্যরাত" আছে। ;) আমি এটি কী বলতে চেয়েছিলাম যে এই সমাধানটি সত্যিকারভাবে বিষয় স্রষ্টাকে সহায়তা করে না। একটি ক্যালেন্ডার সমাধান কুরুচিপূর্ণ দ্বিতীয়-গণনাগুলি এড়িয়ে যায় এবং সঠিকভাবে ব্যবহৃত হলে সময় অঞ্চলগুলির (এবং বিশেষত দিনের আলোর সঞ্চয়ের সময় ইত্যাদি) যত্ন নেয়। আপনার সমাধানে আমি এটি দেখতে পাচ্ছি না।
বাউনার

হাই @ অ্যান্ড্রেভলগিন, আমি তারিখের তারিখটি পেয়েছি = নতুন তারিখ (সময় + টাইমজোন.সেট ডিফল্ট ()। GetRawOffset () - সময়% (24 * 60 * 60 * 1000));
জে

28

মনে রাখবেন, তারিখগুলি (!) Dateউপস্থাপন করতে ব্যবহৃত হয় না । তারিখ উপস্থাপন করতে আপনার একটি ক্যালেন্ডার প্রয়োজন। এই:

Calendar c = new GregorianCalendar();

Calendarআপনার বর্তমান সময় অঞ্চলে বর্তমান তারিখ উপস্থাপন করে একটি উদাহরণ তৈরি করবে । এখন আপনার যা প্রয়োজন তা হ'ল দিনের নীচে প্রতিটি ক্ষেত্রটি (ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ড) এ সেট করে কেটে ফেলুন0 । তোমার এখন আজ মধ্যরাত।

এখন পরের দিন মধ্যরাত পেতে, আপনাকে একদিন যুক্ত করতে হবে:

c.add(Calendar.DAY_OF_MONTH, 1);

যোগ করুন নোট করুন 86400 গ্রীষ্মের সময়গুলির মধ্যে সেকেন্ড বা 24 ঘন্টা যুক্ত করা ভুল কারণ এর মধ্যে ঘটতে পারে।

আপডেট: তবে এই সমস্যাটি মোকাবেলার জন্য আমার প্রিয় উপায়টি হ'ল ব্যবহার করা হ'ল কমন্স ল্যাং থেকে ডেট ইউটিস ক্লাস :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

এটি ব্যবহার করে Calendar পর্দার পিছনে করে ...


15
সাহায্যের জন্য ধন্যবাদ. "তারিখগুলি তারিখগুলি উপস্থাপনের জন্য ব্যবহৃত হয় না" - আমরা এটিই বেশ ফ্রিকিন উজ্জ্বল, তাই না? ;)

@ রবার্টহিউম ন্যায্য হতে, জাভা প্রথম প্রকাশের পরে তারিখ প্রায় হয়েছে। সেই যুগের বেশিরভাগ জিনিস ... নিখুঁতভাবে চিন্তা করার চেয়ে কম। বিশেষত যেহেতু জাভা সর্বপ্রথম চেষ্টা করছিল সেগুলির মধ্যে যা চেষ্টা করেছিল এবং কীভাবে এটি করা যায় তা নিয়ে একমত হওয়া মানক থেকে অনেক দূরে ছিল ।
মনিকা'র মোকদ্দমাটি

14

এই পদ্ধতিগুলি আপনাকে সাহায্য করবে-

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

এবং

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

জোদাটাইম ২.৩ অনুসারে toDateMidnight() করা হয়েছে।

থেকে 2.2 থেকে 2.3 থেকে আপগ্রেড

    ২.২ থেকে অবচয়
    ----------------------
    - ডেটমিডনাইট [# 41]
     এই শ্রেণিটি ধারণায় ত্রুটিযুক্ত
     মাঝরাতের সময় মাঝে মাঝে কিছু সময় অঞ্চলে ঘটে না
     এটি 00:00 থেকে 01:00 পর্যন্ত একটি দিবালোক সঞ্চয় সময় ফলাফল
     ডেটমিডনাইট মূলত একটি ডেটটাইম যার সাথে মাঝরাতে লক করা সময় থাকে
     এই জাতীয় ধারণাটি সাধারণত স্থানীয়ভাবে ব্যবহারের জন্য একটি দুর্বল is
     স্থানীয় তারিখের সাথে ডেটমিডনাইট প্রতিস্থাপন করুন
     অথবা এটি ডেটটাইমের সাথে প্রতিস্থাপন করুন, সম্ভবত টাইমআউটস্টার্টঅফডে () পদ্ধতিটি ব্যবহার করে

toDateMidnight()পদ্ধতি ছাড়াই একটি নমুনা কোড এখানে is

কোড

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

আউটপুট ( আপনার স্থানীয় সময় অঞ্চল অনুসারে পৃথক হতে পারে )

2013-09-28 00:00:00

2
দুর্দান্ত উত্তর। অজান্তে ডিফল্টের উপর নির্ভর করে সময়-অঞ্চল নির্দিষ্টকরণের গুরুত্বকে গুরুত্ব দেওয়ার DateTimeZoneজন্য আমি সেই DateTimeকনস্ট্রাক্টরের কাছে একটি উদাহরণ পাস করার সংযোজন করব :DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
বাসিল বার্ক

8

অন্যান্য উত্তরগুলি সঠিক, বিশেষত জাভা.টাইম উত্তর আরগানহেং দ্বারা । কিছু উল্লিখিত হিসাবে, আপনি পুরানো java.util. তারিখ /.ক্যালেন্ডার ক্লাসগুলি খারাপভাবে নকশাকৃত, বিভ্রান্তিকর এবং ঝামেলাযুক্ত হিসাবে এড়ানো উচিত। সেগুলি জাভা.টাইম ক্লাস দ্বারা সংক্রামিত করা হয়েছে।

মধ্যরাত্রি এবং সময়ের বেশ কয়েকটি সময় পরিচালনা করার বিষয়ে কৌশল সম্পর্কে নোটগুলি যোগ করতে দিন ।

অর্ধেক খোলা

তারিখের সময়কালে কাজের সময়গুলিতে প্রায়শই "অর্ধ-ওপেন" পদ্ধতির সাহায্যে সংজ্ঞা দেওয়া হয়। এই পদ্ধতির শুরুতে অন্তর্ভুক্ত রয়েছে যখন শেষটি একচেটিয়া । এটি সমস্যার সমাধান করে এবং যদি ধারাবাহিকভাবে ব্যবহার করা হয় তবে আপনার তারিখ-সময় পরিচালনার বিষয়ে যুক্তিটি আরও সহজ করে তোলে।

একটি সমস্যার সমাধান হল দিনের শেষ সংজ্ঞা দেওয়া def দিনের শেষ মুহূর্তটি কি 23:59:59.999( মিলিসেকেন্ড )? সম্ভবত, java.util.Date ক্লাসে (প্রথম দিকের জাভা থেকে; ঝামেলা - এই শ্রেণিটি এড়ান !) এবং অত্যন্ত সফল জোদা-টাইম লাইব্রেরিতে। তবে অন্যান্য সফ্টওয়্যারগুলিতে যেমন পোস্টগ্রিসের মতো ডেটাবেস, শেষ মুহুর্তটি হবে 23:59:59.999999( মাইক্রোসেকেন্ডস )। তবে অন্যান্য সফ্টওয়্যারগুলিতে যেমন জাভা.টাইম ফ্রেমওয়ার্ক (জাভা ৮ এবং তার পরে, জোদা-টাইমের উত্তরসূরি) এবং কোনও কোনও ডাটাবেসে যেমন এইচ 2 ডেটাবেস , শেষ মুহুর্তটি হতে পারে 23:59.59.999999999( ন্যানোসেকেন্ডস )। চুল বিভক্ত করার পরিবর্তে, কেবল প্রথম মুহুর্তের হিসাবে বিবেচনা করুন, শেষ মুহুর্ত নয়।

হাফ-ওপেনে, একদিনের প্রথম মুহুর্ত থেকে একটি দিন চলে এবং উপরে যায় তবে পরের দিনের প্রথম মুহূর্তটি অন্তর্ভুক্ত হয় না। বরং এটির মতো চিন্তা করার চেয়ে:

… আজ থেকে সকাল 00:00 টা (এই ভোরে মধ্যরাত) থেকে রাত 12: 00 (আজ রাত্রে)

… এভাবে ভাবুন…

আজকের প্রথম মুহুর্ত থেকে চলার তবে আগামীর প্রথম মুহুর্তটি অন্তর্ভুক্ত নয়:
(> = 00:00:00.0আজ এবং < 00:00:00.0কাল)

ডাটাবেসের কাজে, এই পদ্ধতির অর্থ অপারেটরটি ব্যবহার না করাBETWEEN এসকিউএল-তে ।

দিনের শুরু

উপরন্তু, দিনের প্রথম মুহূর্ত না সবসময় সময় অফ দিন 00:00:00.0দিবালোক সংরক্ষণের সময় (ডিএসটি)কিছু সময় অঞ্চলে এবং সম্ভবত অন্যান্য অসঙ্গতিগুলির অর্থ দিনের শুরু হওয়া আলাদা সময় হতে পারে।

সুতরাং জাভা.টাইম ক্লাসগুলিকে একটি কল দিয়ে কোনও দিনের শুরু নির্ধারণের কাজটি করতে দিন LocalDate::atStartOfDay( ZoneId )। সুতরাং আমরা এই উদাহরণস্বরূপ কোডটিতে দেখতে পেলাম LocalDateএবং তার পিছনে পিছনে যেতে হবে ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Alচ্ছিক পাস করার বিষয়টি নোট করুন ZoneId। বাদ দেওয়া হলে আপনার জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চলটি সুস্পষ্টভাবে প্রয়োগ করা হয়েছে। স্পষ্ট করে বলা ভাল।

তারিখ-সময় কাজের জন্য সময় অঞ্চলটি গুরুত্বপূর্ণ। প্রশ্ন এবং অন্যান্য কিছু উত্তর সম্ভাব্য ত্রুটিযুক্ত কারণ সচেতনভাবে সময় অঞ্চলটি পরিচালনা করে না।

রূপান্তর

আপনার যদি অবশ্যই java.util.Date অথবা .Clavender ব্যবহার করেন তবে সেই পুরানো শ্রেণিতে যুক্ত হওয়া নতুন রূপান্তর পদ্ধতির সন্ধান করুন।

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

সময় বিঘত

যাইহোক, আপনি যদি সময়ের সাথে অনেক কাজ করে থাকেন তবে একবার দেখুন:

  • Duration
  • Period
  • Interval
    Intervalশ্রেণী পাওয়া যায় ThreeTen-এক্সট্রা , প্রকল্প java.time ফ্রেমওয়ার্ক একটি এক্সটেনশান। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির প্রমাণকারী ক্ষেত্র।
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

সম্পর্কিত জাভা.টাইম

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই শ্রেণীর বিরক্তিজনক পুরাতন স্থানচ্যুত উত্তরাধিকার যেমন তারিখ-সময় শ্রেণীর java.util.Date, Calendar, &SimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , এর মাইগ্রেশন উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


6

java.time

আপনি যদি জাভা 8 ব্যবহার করেন এবং তারপরে , আপনি জাভা.টাইম প্যাকেজটি চেষ্টা করতে পারেন ( টিউটোরিয়াল ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
ভাল উত্তর. আমি পছন্দসই / প্রত্যাশিত সময় অঞ্চল নির্দিষ্ট করার পরামর্শ দেব। জেভিএমের বর্তমান ডিফল্ট টাইম জোন ওএস সেটিংস, কম্পিউটার পরিবর্তন বা জেভিএম এর যে কোনও থ্রেডের যে কোনও অ্যাপ্লিকেশন রানটাইমের সময় যে কোনও মুহুর্তে ডিফল্ট পরিবর্তন করতে পারে changing
বাসিল বাউর্কে

4

এটি একটি বিকল্প বলে মনে হচ্ছে:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

এটিতে একটি দিন যুক্ত করুন either

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

অথবা

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

আমার কাছে একটি কুঁচকী আছে যা দিবালোকের মত সঞ্চয়ের মতো 24 ঘন্টা বেশি না হওয়ার কারণে কিছুটা বেঁচে থাকার ক্ষেত্রে পছন্দ হয় ( https://stackoverflow.com/a/4336131/32453 এবং এর অন্যান্য উত্তর দেখুন)।


আমার স্ক্লাইট ডেটাবেসে দীর্ঘ হিসাবে উপস্থাপন করা আমার একটি তারিখ এবং সময় রয়েছে। পরের দিনের শুরুতে আমার একটি দীর্ঘ সময় নেওয়া উচিত। আপনি উপরে যে সরলডেটফর্ম্যাট পদ্ধতিটি ব্যবহার করছেন তার চেয়ে আমি কি এখনও আমার লম্বা তারিখের সাথে ডেট অবজেক্টটি ব্যবহার করতে পারি?
এজেডাব্লু

1
যতক্ষণ না এটি ডান মিলিসেকেন্ড হিসাবে আপনি এটি নির্মাতা
javase

1

আমি এখানে অন্য সবার চেয়ে আলাদাভাবে এটি করেছি। আমি জাভাতে নতুন, তাই আমার সমাধানটি খারাপ।

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

আমি নিশ্চিত যে এটি এখনও কাজ করে না, তবে যে কোনও উপায়েই আমি এই সমাধান সম্পর্কে যে কোনও প্রতিক্রিয়ার প্রশংসা করব।

উপরের বিবৃতিতে আমি বিভ্রান্ত হয়েছি যে আপনি আগামীকাল কল করে গণনা করতে পারবেন:

c.add(Calendar.DAY_OF_MONTH, 1);

আপনি যদি মাসের দিনটিতে 1 যোগ করেন এবং এটি 31 তম দিন, আপনি কি মাসের 32 তম দিন পান না?

সময় / তারিখগুলি সমস্ত জাভাতে ইউটিসির উপর ভিত্তি করে হয় না কেন? আমি মনে করি টাইমজোনগুলি কেবলমাত্র i / o এর সাথে ব্যবহার করা উচিত, তবে অভ্যন্তরীণভাবে সর্বদা ইউটিসিতে ব্যবহার করা উচিত। তবে ক্লাসগুলিতে টাইমজোন সম্পর্কিত তথ্য অন্তর্ভুক্ত বলে মনে হচ্ছে যা কেবল অপব্যয়যোগ্য নয়, তবে কোডিং ত্রুটির প্রবণ।


2
হাই মিচ আমি মনে করি আপনার সমাধানটি কাজ করে তবে এটি দেখতে মনে হয় যে তারিখের নির্মাণকারীর অবচয় রয়েছে। জাভা লোকেরা বেশিরভাগ সময় আসল তারিখ সম্পর্কিত পদ্ধতিগুলি হ্রাস করে এবং সেগুলি নতুন ক্যালেন্ডার সম্পর্কিত পদ্ধতিগুলির সাথে প্রতিস্থাপন করে। ব্যক্তিগতভাবে আমি দেখতে পাচ্ছি না এটি কীভাবে উন্নতি করে তবে অবচিত পদ্ধতিগুলি ব্যবহার করার জন্য এটি নীচে পড়ে। ধন্যবাদ!

অবচয় সম্পর্কে দু: খিত। ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকগুলি সাফ করার চেয়ে বছর, মাস এবং তারিখ নির্দিষ্ট করে দেওয়া আমার কাছে আরও পরিষ্কার মনে হয়। এগুলি সাফ করা তারিখ শ্রেণীর সেরা গ্রানুলারিটি হ'ল মিলিসেকের উপর নির্ভর করে, যদিও আমার সমাধানটি দেয় না। আমার সমাধানটি আরও খাটো এবং পরিষ্কার cle জাভাতে নতুন হওয়া আমাকে তারিখ এবং সময়গুলি ব্যবহার করার ক্ষেত্রে সত্যিই কতটা পরিষ্কার, সহজ এবং দক্ষ সি ++ এর প্রশংসা করে তোলে।
মিচ

@ মিচ আমার অভিজ্ঞতা অনুসারে, আপনি যে সাম্প্রতিকতম ভাষা শিখছেন তা সর্বদা সবচেয়ে জটিল হিসাবে বিবেচিত হয়।
আর্টঅফ ওয়ারফেয়ার

এফওয়াইআই: এই রক্তাক্ত ভয়াবহ পুরানো তারিখ-কাল ক্লাসগুলি এখন উত্তরাধিকার হিসাবে আধুনিক জবা.টাইম ক্লাস দ্বারা অনুপ্রাণিত হয়েছে।
বাসিল বাউরক


0

জোদাটাইম সহ সহজ উপায়

DateMidnight date = DateMidnight.now();


2
না। জোদা-সময়ের "মধ্যরাত" সম্পর্কিত ক্লাস এবং পদ্ধতিগুলি সমস্ত হ্রাস করা হয়েছে। তারা একটি ত্রুটিযুক্ত ধারণা ভিত্তিক ছিল। দিনের প্রথম মুহূর্তটি সবসময় হয় না 00:00:00.000। পরিবর্তে নতুন withTimeAtStartOfDayপদ্ধতিটি ব্যবহার করুন । জোদা-সময়ের বর্তমান সংস্করণ 2.4 এ আপডেট করুন এবং রিলিজ নোটগুলি পড়ুন। উদাহরণ:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
তুলসী বাউরক

0

একটি দিন 24 * 60 * 60 * 1000এমএস হওয়ায় এই দিনের মধ্যরাত হিসাবে গণনা করা যেতে পারে ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
এই কোডটি কেবলমাত্র ইউটিসি এবং অন্য কোনও সময় অঞ্চলের ক্ষেত্রে প্রযোজ্য এবং ডাইটলাইট সেভিং টাইমের মতো অসঙ্গতিগুলি উপেক্ষা করে। তদ্ব্যতীত, নিজের-নিজস্ব তারিখ-সময় সমাধানগুলি বোকামি কারণ এটি একটি আশ্চর্যজনকভাবে জটিল বিষয়। পরিবর্তে দুর্দান্ত জাভা.টাইম ক্লাস ব্যবহার করুন।
তুলিল বাউরক

0

এর আগে উত্তরগুলির মতো অনেক সুন্দর, তবে কেউ এএম_পিএম প্যারামিটারের উল্লেখ করেনি:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
ঝামেলা Calendarশ্রেণিটি বেশ কয়েক বছর আগে জাভা.টাইম ক্লাসগুলির দ্বারা বিশেষত বিশেষভাবে প্রয়োগ করা হয়েছিল ZonedDateTime
বেসিল বাউর্কে

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

এটি কেবল ইউটিসির জন্যই কাজ করে এবং সময় অঞ্চলগুলি সম্বোধন করতে ব্যর্থ হয়। এছাড়াও, ভয়ঙ্কর Dateশ্রেণিটি বহু বছর আগে দ্বারা দমন করা হয়েছিল java.time.InstantDateআজকাল ব্যবহার থেকে বিরত থাকুন।
বাসিল বার্ক

0

অ্যাপাচি কমন্স ব্যবহার করে ..

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

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

@ বাসিলবার্ক জাভা ৮ এর পক্ষে সম্মত হয়েছে। তবে ওপি যদি জাভা using ব্যবহার করে তবে আমার ধারণা এখনও এটি কার্যকর হবে।
joe4java

কার্যত অভিন্ন API সহ থ্রিটেন-ব্যাকপোর্ট প্রকল্পে জাভা time টাইম কার্যকারিতা প্রায় সমস্ত জাভা 6 এবং 7 এর জন্য উপলব্ধ । থ্রিটেনএবিপি প্রকল্পে অ্যান্ড্রয়েড <26 এর জন্য আরও অভিযোজিত । সুতরাং আর কখনও সেই দুর্দিনের পুরানো তারিখের সময় ক্লাসগুলি ব্যবহার করার দরকার নেই।
বেসিল বোর্কে

-1

আমি জানি এটি খুব পুরানো পোস্ট। আমি আমার জ্ঞান এখানে শেয়ার করতে ভেবেছি!

সঠিক সময় অঞ্চল সহ আজ মধ্যরাতের জন্য আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

কোথায় (1000*60 * 330)বিয়োগ করা হচ্ছে অর্থাত্ টাইম জোনের সাথে সম্পর্কিত উদাহরণস্বরূপ ভারতীয় সময় অঞ্চল অর্থাৎ কলকাতা আসল থেকে +5: 30 ঘন্টা আলাদা। তাই বিয়োগ করে মিলিসেকেন্ডে রূপান্তরিত করে।

সুতরাং আপনার অনুসারে সর্বশেষ বাদ দেওয়া নম্বর পরিবর্তন করুন। আমি এমন একটি পণ্য তৈরি করছি যা কেবলমাত্র ভারতে ভিত্তিক তাই নির্দিষ্ট টাইমস্ট্যাম্পটি ব্যবহৃত হয়েছে।


1
আপনি কেন এটি গৃহীত উত্তরের পরিবর্তে পরামর্শ দেবেন? আপনার তারিখ-সময় মানগুলি ঘূর্ণন করা সাধারণভাবে ঝুঁকিপূর্ণ। বিশেষত এই কোডটি একক সময় অঞ্চলের বর্তমান অফসেটটিতে চিরকালের জন্য কঠোর কোডড। দিবালোক সংরক্ষণের সময় বা অন্যান্য অসঙ্গতিগুলির জন্য কোনও অ্যাকাউন্টিং নেই। আমি কোনও অতিরিক্ত মূল্য ছাড়াই কেবল ডাউনসাইডগুলি দেখতে পাচ্ছি।
তুলসী বাউরকে

@ বাসিল অবশ্যই আমি উত্তরটি গ্রহণ করি এবং হ্যাঁ আমি হার্ড কোডিং মূল্যের জন্য সেখানে উল্লেখ করেছি। আপনি যদি নির্দিষ্ট সময় অঞ্চলে কাজ করছেন কেবল তখনই এটি সহায়ক।
রাজীব

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

তবে সাবধান থাকুন যা java.sql.Date.toInstant()সর্বদা ছুড়ে দেয়UnsupportedOperationException

স্থানীয় তারিখের মাধ্যমে java.util.Date এবং বিপরীতে সরলতম রূপান্তর?


না একটি ভাল উত্তর। আপনি যে পুরানো উত্তরাধিকার ক্লাসগুলি অনুকরণ করেন তাদের সাথে আপনি আধুনিক জাভা.টাইমের ব্যবহার মিশ্রণ করছেন। এবং বিশেষত আপনি java.sql তারিখের সময় ক্লাসগুলি ব্যবহার করেন যা কেবলমাত্র একটি ডাটাবেসের সাথে ডেটা বিনিময় করার জন্য ব্যবহার করা উচিত যার ড্রাইভারটি সরাসরি জাভা.টাইম ক্লাসগুলির সাথে ডিল করার জন্য আপডেট করা হয়নি, কখনও ব্যবসায়ের যুক্তির জন্য ব্যবহার করা হবে না। তবুও আরেকটি সমস্যা হ'ল আপনি সময় অঞ্চলটির গুরুত্বপূর্ণ বিষয়টিকে উপেক্ষা করছেন।
বাসিল বাউরক

@ বাসিলবার্ক, সমালোচনার জন্য ধন্যবাদ অন্য উত্তরাধিকার শ্রেণীর উদাহরণ পেতে অবহিত হিসাবে চিহ্নিত না হওয়া এমন একটি উত্তরাধিকার শ্রেণি ব্যবহার করা বেশ নিরাপদ। টাইমজোন ইস্যুটি আরও গুরুত্বপূর্ণ। আমি সিদ্ধান্ত নিয়েছি রিকার্ডোর জবাব সব পরে রাখব ।
ভাদজিম

-1

পুরানো ফ্যাশন উপায় ..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

সেই ঝামেলা ক্লাসটি বহু বছর আগে জাভা.টাইম.আইসান্ট্যান্ট ক্লাস দ্বারা দমন করা হয়েছিল । কখনও ব্যবহার করার প্রয়োজন নেই Date
বাসিল বাউরক

এই Dateশ্রেণিটি সর্বদা ইউটিসিতে থাকে। সুতরাং আপনি পছন্দসই / প্রত্যাশিত সময় অঞ্চলটির বিষয়টি উপেক্ষা করছেন। উদাহরণস্বরূপ, কলকাতার ভারতে একটি নতুন দিন উদয় হয় ইউটিসির চেয়ে কয়েক ঘন্টা আগে এবং মন্ট্রিয়াল কোয়েবেকের ইউটিসির থেকে কয়েক ঘন্টা পরে।
বাসিল বাউরক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.