কোনও দিনের শুরু সময় এবং শেষ সময় কীভাবে পাবেন?


121

কোনও দিনের শুরু সময় এবং শেষ সময় কীভাবে পাবেন?

এই জাতীয় কোড সঠিক নয়:

 private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
}

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
}

এটি মিলিসেকেন্ডের সাথে সঠিক নয়।


8
এটি "নির্ভুল নয়" এর অর্থ কী?
কির্ক ওল

কোডটিতে কী ভুল? আপনি কী প্রত্যাশা করবেন না এমনটি পাচ্ছেন? আপনি কোন সময় অঞ্চলটি চান আপনার দিনগুলি শুরু এবং সেই অনুযায়ী শেষ করা উচিত?
মার্ক রিড

4
উপরের কোডটি পদ্ধতিতে পাসের তারিখটি ব্যবহার করে না। এটি করা উচিত: ক্যালেন্ডার তৈরি হওয়ার পরে ক্যালেন্ডার.সেটটাইম (তারিখ)।
জেরি ডিসট্র্যাম্পস

2
এই প্রশ্নটি ধরে নেয় যে তারিখ-সময়ের মানগুলির রেজিলিউশনটি মিলি সেকেন্ড রয়েছে। Java.util. তারিখ এবং জোদা-সময়ের জন্য সত্য। তবে জাভা time (ন্যানোসেকেন্ডস), জাভা.টাইম প্যাকেজের জন্য মিথ্যা, কিছু ডাটাবেস যেমন পোস্টগ্রিস (মাইক্রোসেকেন্ডস), ইউনিক্স লাইব্রেরি (পুরো সেকেন্ড) এবং সম্ভবত অন্যান্য। হাফ-ওপেন ব্যবহার করে নিরাপদ পদ্ধতির জন্য আমার উত্তরটি দেখুন ।
তুলসী বাউরক

2
প্রকৃতপক্ষে আপনার পরের দিনের শুরু হওয়া উচিত এবং that দিনের আইটেমগুলি পুনরাবৃত্তি করার সময় (ধরে নেওয়া উচিত যে আপনি এটি করতে চান) আপনি <= পরিবর্তে <= ব্যবহার করে উপরের সীমাটি নির্দিষ্ট করবেন। এটি পরের দিন বাদ দেয় তবে আগের দিনের সমস্ত অংশ ন্যানোসেকেন্ডে অন্তর্ভুক্ত করে।
ড্যানিয়েল এফ

উত্তর:


115

TL; ড

LocalDate                       // Represents an entire day, without time-of-day and without time zone.
.now(                           // Capture the current date.
    ZoneId.of( "Asia/Tokyo" )   // Returns a `ZoneId` object.
)                               // Returns a `LocalDate` object.
.atStartOfDay(                  // Determines the first moment of the day as seen on that date in that time zone. Not all days start at 00:00!
    ZoneId.of( "Asia/Tokyo" ) 
)                               // Returns a `ZonedDateTime` object.

দিনের শুরু

একটি সময় অঞ্চলে দেখা হিসাবে আজকের পূর্ণ দৈর্ঘ্য পান।

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

ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( zoneId  ) ;

ZonedDateTime zdtStart = today.atStartOfDay( zoneId ) ;
ZonedDateTime zdtStop = today.plusDays( 1 ).atStartOfDay( zoneId ) ;

zdtStart.toString () = 2020-01-30T00: 00 + 01: 00 [আফ্রিকা / টিউনিস]

zdtStop.toString () = 2020-01-31T00: 00 + 01: 00 [আফ্রিকা / টিউনিস]

ইউটিসিতে একই মুহুর্তগুলি দেখুন।

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

start.toString () = 2020-01-29T23: 00: 00Z

স্টপ.টোস্ট্রিং () = 2020-01-30T23: 00: 00Z

আপনি যদি কোনও তারিখের পুরো দিনটি ইউটিসিতে টাইম জোনের পরিবর্তে দেখতে চান তবে ব্যবহার করুন OffsetDateTime

LocalDate today = LocalDate.now( ZoneOffset.UTC  ) ;

OffsetDateTime odtStart = today.atTime( OffsetTime.MIN ) ;
OffsetDateTime odtStop = today.plusDays( 1 ).atTime( OffsetTime.MIN ) ;

odtStart.toString () = 2020-01-30T00: 00 + 18: 00

odtStop.toString () = 2020-01-31T00: 00 + 18: 00

এই OffsetDateTime বস্তুগুলি ইতিমধ্যে ইউটিসিতে থাকবে, তবে আপনি toInstantসংজ্ঞা অনুসারে সর্বদা ইউটিসিতে থাকা এমন বস্তুর প্রয়োজন হলে আপনি কল করতে পারেন can

Instant start = odtStart.toInstant() ;
Instant stop = odtStop.toInstant() ;

start.toString () = 2020-01-29T06: 00: 00Z

স্টপ টু স্ট্রিং () = 2020-01-30T06: 00: 00Z

টিপ: আপনি এই প্রকল্পের ক্লাসটি অবজেক্টের উপস্থাপনের জন্য ক্লাসটি ব্যবহার করতে আপনার প্রকল্পে থ্রিটেন-অতিরিক্ত লাইব্রেরি যুক্ত করতে আগ্রহী হতে পারেন । যেমন তুলনা জন্য এই শ্রেণীর অফার দরকারী পদ্ধতি , , , ড।IntervalInstantabutsoverlapscontains

Interval interval = Interval.of( start , stop ) ;

ইন্টারভাল.টোস্ট্রিং () = 2020-01-29T06: 00: 00Z / 2020-01-30T06: 00: 00Z

অর্ধেক খোলা

Mprivat দ্বারা উত্তর সঠিক। তার বক্তব্যটি কোনও দিনের শেষে পাওয়ার চেষ্টা না করে বরং "পরের দিন শুরুর আগে" তুলনা করা। তাঁর ধারণা "হাফ-খুলুন" পদ্ধতির সময় একটি স্প্যান টি যেখানে হিসাবে পরিচিত হয় শুরুতে যে সমেত যখন সমাপ্ত স্বতন্ত্র

  • জাভার বর্তমান তারিখ-সময় অবকাঠামো (java.util.Date/Calendar এবং Joda-টাইম ) থেকে উভয় ব্যবহার মিলিসেকেন্ড যুগান্তকারী । তবে জাভা 8-এ, নতুন জেএসআর 310 জাভা.টাইম। * ক্লাসগুলি ন্যানোসেকেন্ড রেজোলিউশন ব্যবহার করে। দিনের শেষ মুহুর্তের মিলিসেকেন্ড গণনা জোর করে আপনি যে কোড লিখেছেন তা নতুন ক্লাসে স্যুইচ করা থাকলে ভুল হবে incor
  • অন্যান্য উত্স থেকে ডেটা তুলনা ত্রুটিযুক্ত হয়ে ওঠে যদি তারা অন্যান্য রেজোলিউশন ব্যবহার করে। উদাহরণস্বরূপ, ইউনিক্স গ্রন্থাগারগুলি সাধারণত পুরো সেকেন্ডে নিয়োগ করে এবং পোস্টগ্রিসের মতো ডেটাবেসগুলি মাইক্রোসেকেন্ডগুলিতে তারিখ-সময়কে সমাধান করে।
  • মধ্যরাতের উপর দিবালোক সংরক্ষণের কিছু পরিবর্তন ঘটে যা জিনিসগুলিকে আরও বিভ্রান্ত করতে পারে।

এখানে চিত্র বর্ণনা লিখুন

Joda-টাইম এই খুব উদ্দেশ্যে 2.3 অফার একটি পদ্ধতি, দিনের প্রথম মুহূর্ত প্রাপ্ত: withTimeAtStartOfDay()। একইভাবে জাভা.টাইমে LocalDate::atStartOfDay,।

আরও আলোচনার এবং উদাহরণগুলি দেখতে "জোদা অর্ধ-খোলা" এর জন্য স্ট্যাকওভারফ্লো অনুসন্ধান করুন

এই পোস্টটি দেখুন, সময়ের ব্যবধান এবং অন্যান্য ব্যাপ্তিগুলি বিল স্নাইডারের দ্বারা অর্ধ-খোলা হওয়া উচিত

উত্তরাধিকারের তারিখ-সময় ক্লাসগুলি এড়িয়ে চলুন

Java.util. তারিখ এবং .ক্যালেন্ডার ক্লাসগুলি কুখ্যাত সমস্যাযুক্ত। এগুলি এড়িয়ে চলুন।

জাভা.টাইম ক্লাস ব্যবহার করুন । Java.time ফ্রেমওয়ার্ক অত্যন্ত সফল অফিসিয়াল উত্তরাধিকারী Joda-টাইম গ্রন্থাগার।

java.time

জাভা.টাইম ফ্রেমওয়ার্কটি জাভা 8 এবং তার পরে তৈরি করা হয়েছে। থ্রিটেন-ব্যাকপোর্ট প্রকল্পে জাভা 6 এবং 7 এ ব্যাক-পোর্টড , আরও থ্রিডেএনএবিপি প্রকল্পে অ্যান্ড্রয়েডের সাথে অভিযোজিত ।

একটি Instantমধ্যে টাইমলাইনে একটি মুহূর্ত ইউটিসি একটি রেজোলিউশনে ন্যানোসেকেন্ড

Instant instant = Instant.now();

কিছু লোকালের জন্য প্রাচীর-ঘড়ির সময় পেতে একটি সময় অঞ্চল প্রয়োগ করুন ।

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

দিনের প্রথম মুহূর্তটি পেতে LocalDateক্লাস এবং তার atStartOfDayপদ্ধতির মধ্য দিয়ে যান ।

ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );

হাফ-ওপেন পদ্ধতির ব্যবহার করে, নিম্নলিখিত দিনের প্রথম মুহূর্তটি পান।

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

আধুনিক ও উত্তরাধিকার উভয় ক্ষেত্রে জাভাতে সমস্ত তারিখ-সময়ের ধরণের সারণী

বর্তমানে জাভা.টাইম ফ্রেমওয়ার্কে Intervalজোদা-টাইমের জন্য নীচে বর্ণিত শ্রেণীর অভাব রয়েছে । তবে থ্রিটেন-এক্সট্রা প্রকল্পটি অতিরিক্ত ক্লাসের সাথে জাভা.টাইম প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির প্রমাণকারী ক্ষেত্র। এর ক্লাসগুলির মধ্যে রয়েছে Interval। একটি আঁকো Intervalএকজোড়া ক্ষণস্থায়ী দ্বারা Instantবস্তু। আমরা Instantআমাদের ZonedDateTimeবস্তু থেকে একটি নিষ্কাশন করতে পারেন ।

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );

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

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

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

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

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

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


Joda-টাইম

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

Joda-টাইম তিনটি শ্রেণীতে নানাভাবে সময় একটি স্প্যান প্রতিনিধিত্ব করতে আছে: Interval, Period, এবং Duration। একটি Intervalমহাবিশ্বের টাইমলাইনে একটি নির্দিষ্ট সূচনা এবং শেষ আছে। এটি "একটি দিন" উপস্থাপন করার জন্য আমাদের প্রয়োজনীয়তার সাথে খাপ খায়।

withTimeAtStartOfDayশূন্যে দিনের সময় নির্ধারণের পরিবর্তে আমরা পদ্ধতিটিকে কল করি । দিবালোক সংরক্ষণের সময় এবং অন্যান্য অসঙ্গতিগুলির কারণে দিনের প্রথম মুহূর্তটি নাও হতে পারে 00:00:00

জোদা-সময় ২.৩ ব্যবহার করে কোডের উদাহরণ।

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( timeZone );
DateTime todayStart = now.withTimeAtStartOfDay();
DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();
Interval today = new Interval( todayStart, tomorrowStart );

যদি আপনার অবশ্যই হয় তবে আপনি java.util.Date এ রূপান্তর করতে পারেন।

java.util.Date date = todayStart.toDate();

আমি ব্যবহার করতে হবেLocalDateTime
user924

170

জাভা 8


public static Date atStartOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
    return localDateTimeToDate(startOfDay);
}

public static Date atEndOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
    return localDateTimeToDate(endOfDay);
}

private static LocalDateTime dateToLocalDateTime(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}

private static Date localDateTimeToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

আপডেট করুন : আমি কি আমার জাভা ইউটিলিটি ক্লাস এইসব 2 পদ্ধতি জুড়েছেন এখানে

এটি মাভেন কেন্দ্রীয় সংগ্রহস্থলটিতে রয়েছে:

<dependency>
  <groupId>com.github.rkumsher</groupId>
  <artifactId>utils</artifactId>
  <version>1.3</version>
</dependency>

জাভা 7 এবং পূর্ববর্তী


অ্যাপাচি কমন্স সহ

public static Date atEndOfDay(Date date) {
    return DateUtils.addMilliseconds(DateUtils.ceiling(date, Calendar.DATE), -1);
}

public static Date atStartOfDay(Date date) {
    return DateUtils.truncate(date, Calendar.DATE);
}

অ্যাপাচি কমন্স ব্যতীত

public Date atEndOfDay(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();
}

public Date atStartOfDay(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();
}

5
আমি এই পদ্ধতির বিপরীতে সুপারিশ করব কারণ আপনি সময় অঞ্চল, দিবালোক সঞ্চয় ইত্যাদির সাথে যুক্ত হবেন যে জোড়ার মতো সময় গ্রন্থাগারটি আপনার যত্ন নেবে।
এডওয়ার্ড অ্যান্ডারসন

7
আমি মনে করি এটি getStartOfDayহওয়া উচিত: LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);আই লোকালটাইম, লোকালডেটটাইম নয়।
কনস্ট্যান্টিন কুলাগিন

সেগুলি ভাবেন না getEndOfDay(Date date)getStartOfDay(Date date)জাভা 8 বিভাগের পদ্ধতিগুলি সঠিক, যথা লোকালডেটটাইম.ম্যাক্স এবং .মিন আপনাকে অতীতের এবং ভবিষ্যতের সর্বাপেক্ষা তাত্পর্যপূর্ণ তারিখগুলিতে রাখে , কোনও দিনের শুরু এবং শেষ নয় । পরিবর্তে আমি শুরু করার জন্য .atStartOfDay () এবং .plusDays (1) .atStartOfDay ()। MinusNanos (1) এর জন্য শেষ পরামর্শ দেব suggest
গ্লেন মাজাজা

পদ্ধতিটি localDateTimeToDate(LocalDateTime startOfDay)ব্যতিক্রম ছোঁড়ে - java.lang.IllegalArgumentException: java.lang.ArithmeticException: দীর্ঘ ওভারফ্লো
সানলাক

1
@GlenMazza জাভা 8 সমাধান ব্যবহার করে স্থানীয়সময় .MAX না LocalDateTime.MAX । সমাধানটি সঠিক।
ফ্রেডেরিকো পান্টুজা

28

getEndOfDay এ, আপনি যুক্ত করতে পারেন:

calendar.set(Calendar.MILLISECOND, 999);

যদিও গাণিতিকভাবে কথা বলা হচ্ছে, আপনি "পরের দিন শুরুর আগে" বলে ছাড়া অন্য কোনও দিনের শেষে নির্দিষ্ট করতে পারবেন না।

সুতরাং পরিবর্তে বলছে, if(date >= getStartOfDay(today) && date <= getEndOfDay(today)), আপনি বলতে হবে: if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow))। এটি অনেক বেশি দৃ definition় সংজ্ঞা (এবং আপনাকে মিলিসেকেন্ড যথার্থতার বিষয়ে চিন্তা করতে হবে না)।


1
এই উত্তরের দ্বিতীয়ার্ধটি সেরা উপায়। এই পদ্ধতির "হাফ-ওপেন" নামে পরিচিত। আমি আমার উত্তরে আরও ব্যাখ্যা করি
তুলসী বাউরক

14

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
// end of a day
now.with(LocalTime.MAX); // 2015-11-19T23:59:59.999999999

3
এই উত্তরটি ডায়ালাইট সেভিং টাইম (ডিএসটি) এর মতো অসঙ্গতিগুলিকে উপেক্ষা করে। Local…ক্লাস সময় অঞ্চল কোন ধারণা এবং ব্যতিক্রমসমূহ সমন্বয় আছে। উদাহরণস্বরূপ, কিছু সময় অঞ্চলগুলির মধ্যরাতে একটি ডিএসটি চেঞ্জ-ওভার থাকে, তাই দিনের প্রথম মুহুর্তটি এই কোড দ্বারা উত্পাদিত মানের 01:00:00.0চেয়ে সময় হয় (সকাল 1 টা) 00:00:00.0ZonedDateTimeপরিবর্তে ব্যবহার করুন।
বাসিল বাউরক

4

জাভা 8 জাভা.টাইম.জোনডেটটাইম দিয়ে দিন শুরু করার পরিবর্তে দিনের শুরু সন্ধানের অতিরিক্ত উপায়টি জোনডেটটাইম LocalDateTimeটাইমকে DAYS এ ছাঁটাই করে দেওয়া হয়:

zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );

2

জাভা 8 এর জন্য নিম্নলিখিত একক লাইন বিবৃতি কাজ করছে। এই উদাহরণে আমি ইউটিসি টাইমজোন ব্যবহার করি। আপনি বর্তমানে ব্যবহৃত সময় অঞ্চল পরিবর্তন করতে দয়া করে বিবেচনা করুন।

System.out.println(new Date());

final LocalDateTime endOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
final Date          endOfDayAsDate = Date.from(endOfDay.toInstant(ZoneOffset.UTC));

System.out.println(endOfDayAsDate);

final LocalDateTime startOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
final Date          startOfDayAsDate = Date.from(startOfDay.toInstant(ZoneOffset.UTC));

System.out.println(startOfDayAsDate);

আউটপুট সঙ্গে সময় পার্থক্য না হলে। চেষ্টা করুন:ZoneOffset.ofHours(0)


1
কীভাবে এটি বিদ্যমান উত্তরগুলির চেয়ে বেশি মূল্য যুক্ত করে? এছাড়াও, আপনি সময় অঞ্চলটির গুরুত্বপূর্ণ সমস্যাটিকে উপেক্ষা করবেন। এবং ইউটিসি ধ্রুবককে উত্তীর্ণ toInstantকরা অবৈধ বাক্য গঠন এবং ধারণাগতভাবে রিডানড্যান্ট।
তুলিল বাউরক

@ বাসিলবউরক "কীভাবে এটি বিদ্যমান উত্তরগুলির চেয়ে বেশি মূল্য যুক্ত করে?" স্ট্যাকওভারফ্লো এভাবেই কাজ করে। বিটিডাব্লু এটি কেবল একটি টেম্পলেট। লোকেরা তাদের পছন্দ মতো পরিবর্তন করতে পারে। ইউটিসি থেকে টু ইনস্ট্যান্টে পাস করা পুরোপুরি আইনী আপনি আউটপুটগুলি পরীক্ষা করতে পারেন।
Fırat KÜÇÜK

2

জাভা 8 বা থ্রিটেনএবিপি

ZonedDateTime

ZonedDateTime curDate = ZonedDateTime.now();

public ZonedDateTime startOfDay() {
    return curDate
    .toLocalDate()
    .atStartOfDay()
    .atZone(curDate.getZone())
    .withEarlierOffsetAtOverlap();
}

public ZonedDateTime endOfDay() {

    ZonedDateTime startOfTomorrow =
        curDate
        .toLocalDate()
        .plusDays(1)
        .atStartOfDay()
        .atZone(curDate.getZone())
        .withEarlierOffsetAtOverlap();

    return startOfTomorrow.minusSeconds(1);
}

// based on https://stackoverflow.com/a/29145886/1658268

LocalDateTime

LocalDateTime curDate = LocalDateTime.now();

public LocalDateTime startOfDay() {
    return curDate.atStartOfDay();
}

public LocalDateTime endOfDay() {
    return startOfTomorrow.atTime(LocalTime.MAX);  //23:59:59.999999999;
}

// based on https://stackoverflow.com/a/36408726/1658268

আমি আশা করি যে কাউকে সাহায্য করবে


"অ্যাটটাইম" পদ্ধতিটি দিনের শেষের জন্য ধ্রুবক "লোকালটাইম.ম্যাক্স" সহ একটি খুব ভাল পদ্ধতির টোগিটার। নিস!
মিঃ অ্যান্ডারসন

2

আমি এই কোডটি চেষ্টা করেছিলাম এবং এটি ভাল কাজ করে!

final ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
final ZonedDateTime startofDay =
    now.toLocalDate().atStartOfDay(ZoneOffset.UTC);
final ZonedDateTime endOfDay =
    now.toLocalDate().atTime(LocalTime.MAX).atZone(ZoneOffset.UTC);

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

1

অন্য একটি সমাধান যা কোনও কাঠামোর উপর নির্ভর করে না:

static public Date getStartOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date(day.getTime() / oneDayInMillis * oneDayInMillis);
}

static public Date getEndOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date((day.getTime() / oneDayInMillis + 1) * oneDayInMillis - 1);
}

মনে রাখবেন এটি ইউটিসি ভিত্তিক সময় দেয়


1
private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
    }

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
    }

calendar.setTimeInMillis (0); আপনাকে মিলিসেকেন্ড পর্যন্ত নির্ভুলতা দেয়


1
এই ভয়াবহ তারিখ-সময় ক্লাসগুলি বহু বছর আগে জেএসআর 310-এ সংজ্ঞায়িত আধুনিক জাভা.টাইম ক্লাস দ্বারা পরিবাহিত হয়েছিল
বেসিল

@ বাসিলবার্ক প্যাকেজটি জাভা.টাইম কেবল জাভা 8 এ উপস্থিত হয়েছিল যা কেবলমাত্র অ্যান্ড্রয়েড এন (এপিআই 26) থেকে পাওয়া যায়
আইভান

@ আইভান 8 এম 8 জাভা.টাইম কার্যকারিতাটির বেশিরভাগটি থ্রিটেন-ব্যাকপোর্ট লাইব্রেরিতে জাভা 6 এবং 7 এ ব্যাকপোর্ট করা হয়থ্রিটেনএবিপি লাইব্রেরিতে প্রারম্ভিক অ্যান্ড্রয়েড (<26) এর জন্য আরও অভিযোজিত ।
তুলসী বাউরক

@ বেসিলবার্ক তবে থ্রিডেন অ্যান্ড্রয়েডে একটি অত্যন্ত অদক্ষ প্রক্রিয়া ব্যবহার করে
ivan8m8

@ ivan8m8 আপনি এর পূর্বসুরী চিন্তা হতে পারে java.time , Joda-টাইম । আবার, থ্রিটিএনএবিপি প্রকল্প দেখুন। অ্যান্ড্রয়েডে using লাইব্রেরিটি ব্যবহার করে এমন অদক্ষতার কথা আমি শুনিনি।
িল

0

আমি জানি কিছুটা দেরি হয়ে গেছে, তবে জাভা 8 এর ক্ষেত্রে আপনি যদি অফসেটডেটটাইম ব্যবহার করে থাকেন (যা অনেক সুবিধা দেয় যেমন টাইমজোন, ন্যানোসেকেন্ডস ইত্যাদি) আপনি নীচের কোডটি ব্যবহার করতে পারেন:

OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
// output: 2019-01-10T23:59:59.999999999Z

0

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

        LocalDate today = LocalDate.now();
        Instant startDate = Instant.parse(today.toString()+"T00:00:00Z");
        Instant endDate = Instant.parse(today.toString()+"T23:59:59Z");

এবং আমরা ফলাফল হিসাবে আছে

        startDate = 2020-01-30T00:00:00Z
        endDate = 2020-01-30T23:59:59Z

আমি এটি আপনাকে সাহায্য করে আশা করি


দিনটি প্রকৃতপক্ষে নিম্নলিখিত দিনের প্রথম মুহুর্তের আগমনে শেষ হয়। আপনার কোড দিনের শেষ দ্বিতীয় দ্বিতীয় দিকে যায়, এমন এক বিলিয়ন ন্যানো সেকেন্ড যা কখনও রিপোর্ট করা হয় না। সময়ের উত্তর নির্ধারণের অর্ধ-ওপেন পদ্ধতির বিষয়ে জানতে আমার উত্তর দেখুন ।
তুলসী বার্ক

তারিখ-সময় মানগুলি পরিচালনা করার উপায় হিসাবে স্ট্রিংগুলি পরিচালনা করা সাধারণত একটি দুর্বল পদ্ধতি। এই কাজের জন্য বোবা স্ট্রিংয়ের চেয়ে স্মার্ট অবজেক্ট ব্যবহার করুন। Java.time শ্রেণীর সকল ক্রিয়াকলাপ আপনি STRING ম্যানিপুলেশন অবলম্বন না এই সমস্যার জন্য দিতে।
তুলসী বার্ক

আমি এখনই আমার উত্তরে একটি টিএল; ডাঃ বিভাগ যুক্ত করেছি যাতে দেখায় যে কীভাবে কোনও দিনের জুড়ি হিসাবে কোনও দিনের ব্যাপ্তি পাওয়া যায়। টিপ: আপনার প্রকল্পটির ক্লাসটি ব্যবহার করতে আপনার প্রকল্পে থ্রিটেন-অতিরিক্ত লাইব্রেরি যুক্ত করতে আগ্রহী হতে পারেন । InstantInterval
তুলসী বাউরক

0

আমি মনে করি সবচেয়ে সহজ কিছু হবে:

// Joda Time

DateTime dateTime=new DateTime(); 

StartOfDayMillis = dateTime.withMillis(System.currentTimeMillis()).withTimeAtStartOfDay().getMillis();
EndOfDayMillis = dateTime.withMillis(StartOfDayMillis).plusDays(1).minusSeconds(1).getMillis();

এই মিলিস জোডা সময়ের সাথে আপনার প্রয়োজন অনুসারে ক্যালেন্ডার, তাত্ক্ষণিক বা স্থানীয় তারিখে রূপান্তরিত হতে পারে।


-2
public static Date beginOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    return cal.getTime();
}

public static Date endOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999);

    return cal.getTime();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.