জোদা-সময়ে দুটি তারিখের মধ্যে দিনের সংখ্যা


335

দুটি জোদা-সময়ের DateTime দৃষ্টান্তের মধ্যে দিনের মধ্যে আমি কীভাবে পার্থক্য খুঁজে পাব ? 'দিনের মধ্যে পার্থক্য' এর অর্থ আমি যদি সোমবার থেকে শুরু হয় এবং মঙ্গলবার হয় তবে আমি শুরু এবং শেষের তারিখের ঘন্টা / মিনিট / সেকেন্ড নির্বিশেষে 1 এর ফেরতের মান আশা করি।

Days.daysBetween(start, end).getDays() শুরুটি সন্ধ্যা হলে এবং সকালে শেষ হলে আমাকে 0 দেয়।

অন্যান্য তারিখের ক্ষেত্রগুলির সাথেও আমার একই সমস্যা রয়েছে তাই আমি আশা করছিলাম যে কম গুরুত্বের ক্ষেত্রগুলিকে 'উপেক্ষা' করার একটি জেনেরিক উপায় থাকবে।

অন্য কথায়, ফেব্রুয়ারি থেকে 4 মার্চের মধ্যে মাসগুলিও 1 হবে, যেমন 14:45 এবং 15:12 এর মধ্যে সময়কাল হবে। তবে 14:01 এবং 14:55 এর মধ্যে সময়ের পার্থক্য 0 হবে।

উত্তর:


393

বিরক্তিকরভাবে, টাইমএটস্টার্টঅফডে উত্তরটি ভুল হলেও কেবল মাঝে মধ্যে। তুমি চাও:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

দেখা যাচ্ছে যে "মধ্যরাত / দিনের শুরু" এর অর্থ মাঝে মাঝে 1am (কিছু জায়গায় এইভাবে দিবালোকের সঞ্চয় হয়), যা Days.daysBetween সঠিকভাবে পরিচালনা করে না।

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

একটি LocalDateপার্শ্ব প্রতিক্রিয়া মাধ্যমে পুরো বিষয়টি ps


আপনি যে নির্দিষ্ট Days.daysBetweenডেটাটিকে ভুল বলে মনে করেন সেখানে উদাহরণের একটি কেস সরবরাহ করতে পারেন ?
তুলিল বাউর্ক

আপনি যখন ব্যবহার করতে বলছেন Instant, আপনি কেবল তার সম্পর্কে কথা বলছেন না start.toInstant(), তাই না?
প্যাট্রিক এম

@ পেট্রিকএম হ্যাঁ, আমি ছিলাম। প্রতিবিম্বের উপর, এটি চাপিয়ে দেওয়ার উদ্দেশ্যে কি সীমাবদ্ধতা ঠিক তা স্পষ্ট নয়, তাই আমি এই শেষ বাক্যটি সরিয়ে দেব। ধন্যবাদ!
এলিস পার্সেল

@chrispy daysBetween ডক এটা সংখ্যা ফেরৎ বলছেন গোটা দিন। আমার ক্ষেত্রে 2 দিন 1 ঘন্টা আমাকে 3 দিন ফেরত দেওয়া উচিত। আপনার উদাহরণে এটি 2 দিন ফিরে আসে। এই অর্জন করার জন্য একটি উপায় আছে কি?
সুজিত জোশী

@ সুজিত জোশি আমি ভয় করি যে আমি আপনার প্রশ্নটি বুঝতে পারি না। আমি একটি সম্পূর্ণ স্ট্যাক ওভারফ্লো প্রশ্ন পোস্ট করার এবং আমার জন্য এখানে একটি লিঙ্ক আটকানোর পরামর্শ দিচ্ছি :)
অ্যালিস পুরসেল

186

Days শ্রেণী

পদ্ধতিটি Daysসহ ক্লাসটি ব্যবহার করা withTimeAtStartOfDayউচিত:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

1
ধন্যবাদ! আমি জোড়ার সাথে android.text.format.DateUtils.getRelativeTimeSpanString () এর আচরণটি অর্জন করার চেষ্টা করছিলাম এবং এটি সত্যই কার্যকর ছিল।
gosho_ot_pochivka

1
স্যার, এই পোস্টের রেফারেন্স সহ toDateMidnight()ডেটটাইম টাইপ থেকে পদ্ধতিটি অবচয় করা হয়েছে।
অনিকেত কুলকার্নি

2
আপনার এখন .toDateMidnight () এর পরিবর্তে .TimeAtStartOfDay () ব্যবহার করা উচিত
bgolson

2
যদি সদাপ্রভুর endআগে হয় startতবে তা কি নেতিবাচক দিনগুলি ফেরায়?
আখি

7
@ আখিয়ার: আপনি কেন চেষ্টা করবেন না?
মাইকেল বর্গওয়ার্ট

86

আপনি ব্যবহার করতে পারেন LocalDate:

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 

স্যার, এই পোস্টের রেফারেন্স সহ toDateMidnight()ডেটটাইম টাইপ থেকে পদ্ধতিটি অবচয় করা হয়েছে।
অনিকেত কুলকারনী

কেন ব্যবহার new LocalDate(date)করবেন date.toLocalDate()?
সারোস

9

TL; ড

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.toLocalDate(), 
    later.toLocalDate() 
)

... অথবা ...

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

এফওয়াইআই, জোডা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে , দলটি জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশনের পরামর্শ দিচ্ছে

Joda-টাইম সমতুল্য DateTimeহয় ZonedDateTime

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

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

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

ChronoUnitঅতিবাহিত দিন বা অন্যান্য ইউনিট গণনা করতে এনাম ব্যবহার করুন ।

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

অগ্রভাগ ছাঁটিয়া দেত্তয়া

আপনি এই গণনাটি করার আরও সাধারণ উপায় সম্পর্কে জিজ্ঞাসা করছেন যেখানে আপনি ষাট মিনিটের স্প্যানস-অফ-সময় হিসাবে পুরো ঘন্টার চেয়ে ঘন্টা অবধি ঘন্টার ঘন্টা ব-দ্বীপ হিসাবে আগ্রহী, truncatedToপদ্ধতিটি ব্যবহার করুন ।

এখানে আপনার একই দিনে 14:45 থেকে 15:12 এর উদাহরণ।

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );

1

এটি কয়েক দিন ধরে কাজ করে না। এই ক্ষেত্রে ToLocalDate () ব্যবহার করুন।


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

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

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

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

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

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

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

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


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

2

গৃহীত উত্তর দুটি LocalDateবস্তু তৈরি করে, যা আপনি যদি প্রচুর ডেটা পড়েন তবে বেশ ব্যয়বহুল। আমি এটি ব্যবহার:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

কল করে getMillis()আপনি ইতিমধ্যে বিদ্যমান ভেরিয়েবল ব্যবহার করুন।
MILLISECONDS.toDays()তারপরে, একটি সাধারণ গাণিতিক গণনা ব্যবহার করে, কোনও বস্তু তৈরি করে না।


1
এই উত্তরটি কেবল তখনই কাজ করে যদি আপনার 'দিনগুলি' এর সংজ্ঞা সময় অঞ্চল এবং তারিখগুলি বিবেচনা না করে ঠিক 24 ঘন্টা দীর্ঘ হয়। যদি তা হয় তবে এই পদ্ধতির ব্যবহার করুন। যদি তা না হয় তবে অন্যান্য উত্তরগুলির দিকে লক্ষ্য করুন যে ঠিকানাগুলির সময় অঞ্চলগুলি।
বাসিল বাউরক

@ বাসিলবার্ক, আপনি ঠিক বলেছেন, তবুও, আমি পাটিগণিত গণনার উপর ভিত্তি করে একটি সমাধানের জন্য যাচ্ছি বরং প্রতিটি পদ্ধতির কলের জন্য ব্যয়বহুল অবজেক্ট তৈরি করা, এই জাতীয় গণনার জন্য সেখানে অনেক স্বাদ রয়েছে, যদি আপনি কোনও ওয়েব পৃষ্ঠা থেকে কোনও ইনপুট পড়ছেন, ঠিক আছে, তবে আপনি যদি কয়েক হাজার লাইনের সাহায্যে লগ ফাইলটি প্রসেস করছেন তবে এটি খুব ধীর হয়ে যায়
JBoy

1
জাভা আপনার লুপটি গরম হলে অবজেক্ট বরাদ্দকে অপ্টিমাইজ করবে। ডকস.ওরাকল.com
অ্যালিস পার্সেল

1

java.time.Period

দিন গণনা করতে java.time.Periodক্লাসটি ব্যবহার করুন ।

যেহেতু জাভা 8 পার্থক্য গণক ব্যবহার আরও বেশি ধারণাসম্পন্ন হয় LocalDate, LocalDateTimeদুটি তারিখের প্রতিনিধিত্ব করতে

    LocalDate now = LocalDate.now();
    LocalDate inputDate = LocalDate.of(2018, 11, 28);

    Period period = Period.between( inputDate, now);
    int diff = period.getDays();
    System.out.println("diff = " + diff);

0
DateTime  dt  = new DateTime(laterDate);        

DateTime newDate = dt.minus( new  DateTime ( previousDate ).getMillis());

System.out.println("No of days : " + newDate.getDayOfYear() - 1 );    

-11
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}

1
প্রশ্নটি বিশেষত জোদা-সময়কে খুঁজছে।
কাপাড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.