জাভা 8 এ দুটি তারিখের মধ্যে দিন গণনা করুন


249

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

এই বিধিনিষেধগুলির সাথে ফাংশনটির অভিযোগ করা দরকার:

  1. তারিখের সেভটাইম থেকে ত্রুটিগুলি প্রতিরোধ করুন
  2. ইনপুট দুটি তারিখের অবজেক্ট (সময় ব্যতীত আমি স্থানীয় তারিখের সময় জানি, তবে তারিখের উদাহরণগুলি দিয়ে আমার করা দরকার)


@ ম্যাডপ্রোগ্রামার সত্যই নয় - সময়সীমা এটি করার পক্ষে সবচেয়ে উপযুক্ত নয় ...
অ্যাসিলিয়াস

@ এ্যাসিয়ালিয়াস ওয়েল, ওপি যা করেছে তার থেকে এটি আরও ভাল
ম্যাডপ্রোগ্রামার

@Asslias তাহলে কি?
ম্যাডপোগ্রামার

15
@MadProgrammer DAYS.between(localDate1, localDate2)
Assylias

উত্তর:


432

আপনি যদি লজিক্যাল ক্যালেন্ডার দিন চান তবে এর DAYS.between()থেকে পদ্ধতিটি ব্যবহার করুন java.time.temporal.ChronoUnit:

LocalDate dateBefore;
LocalDate dateAfter;
long daysBetween = DAYS.between(dateBefore, dateAfter);

আপনি যদি আক্ষরিক 24 ঘন্টা দিন চান (একটি সময়কাল ), আপনি তার Durationপরিবর্তে ক্লাসটি ব্যবহার করতে পারেন :

LocalDate today = LocalDate.now()
LocalDate yesterday = today.minusDays(1);
// Duration oneDay = Duration.between(today, yesterday); // throws an exception
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option

আরও তথ্যের জন্য, এই দস্তাবেজটি দেখুন


15
এটি একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, কারণ সময়কাল.বিধ্বনী পদ্ধতিতে অস্থায়ী বস্তুর প্রয়োজন যা SECONDS ইউনিটকে সমর্থন করতে সক্ষম । পরিবর্তে, চেষ্টা করুন Duration.between(today.atTime(0, 0), yesterday.atTime(0, 0)).toDays()
ভিজিআর

5
পরিবর্তে today.atTime(0, 0)আপনি করতে পারেন today.atStartOfDay()
eee

5
@ আরাচুস সম্ভবত -1টি কিছুটা কঠোর ছিল কারণ আপনার প্রস্তাবিত কোডটি কাজ করে তবে সময়কাল "সময় ভিত্তিক পরিমাণ" পরিমাপ করার জন্য to বেশ কয়েকটি দিন পরিমাপের একটি অন্তর্নির্মিত উপায় রয়েছে যার জন্য তারিখ থেকে তারিখের সময় রূপান্তর প্রয়োজন হয় না।
Assylias

স্থানীয় তারিখের জন্য আরও ভাল উত্তরটি হ'ল নীচে @ সুনিল বি'র উত্তর:ChronoUnit.DAYS.between(firstDate, secondDate)
ল্যাপ্রো

@ ল্যাপ্রো কেন এটি ভাল? এটি আমার উত্তর হিসাবে একই পদ্ধতি ব্যবহার করে
সিন্ট্যাগমা

129

এখানে ভিজিআর এর মন্তব্যের ভিত্তিতে আপনি যা ব্যবহার করতে পারেন তা হল:

ChronoUnit.DAYS.between(firstDate, secondDate)

38

আপনি ব্যবহার করতে পারেন until():

LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25);

System.out.println("Until christmas: " + independenceDay.until(christmas));
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS));

4
আমি প্রথম সংস্করণটির সাথে যে গোচাটির মুখোমুখি হয়েছি untilতা হ'ল এটি একটি পিরিয়ড অবজেক্ট দেয়। এটি দুটি তারিখের মধ্যে বেশিরভাগ বছর / মাস / দিন ফিরে আসবে, দিনের প্রকৃত সংখ্যা নয়। এবং পিরিয়ডে গেটডেস () পিছু পিছু দিনগুলির সংখ্যা না করে কেবল দিনের অংশগুলি (বছর বা মাসের সংখ্যা বিবেচনায় না নেয়) দেয়। দ্বিতীয় সংস্করণ দুটি তারিখের মধ্যে বেশ কয়েকটি দিন পাওয়ার জন্য ঠিক তেমনভাবে কাজ করে।
এম জাস্টিন

এর জন্য কি এখানে একটি সম্পূর্ণ বিকল্প আছে? যেহেতু এটির জন্য অ্যান্ড্রয়েড
এসডিকে

11

আপনি DAYS.betweenথেকে ব্যবহার করতে পারেনjava.time.temporal.ChronoUnit

যেমন

import java.time.temporal.ChronoUnit;

public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) {
    return DAYS.between(dateBefore, dateAfter);
}

9

তাহলে startDate এবং endDate দৃষ্টান্ত হয় java.util.Date

আমরা ChronoUnit enum থেকে () পদ্ধতির মধ্যে ব্যবহার করতে পারি :

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive) {
    //..
}

ChronoUnit.DAYS গণনা দিন যা 24 ঘন্টা শেষ হয়

import java.time.temporal.ChronoUnit;

ChronoUnit.DAYS.between(startDate.toInstant(), endDate.toInstant());

//OR 

ChronoUnit.DAYS.between(Instant.ofEpochMilli(startDate.getTime()), Instant.ofEpochMilli(endDate.getTime()));

7

এনএল জাভা.টাইম.টেম্পোরাল.ক্রোনো ইউনাইটে ডে-ই ব্যবহার করুন । নমুনা কোডের নীচে:

আউটপুট: * শুরুর তারিখ: 2015-03-01 এবং শেষ তারিখের মধ্যে দিনের সংখ্যা: 2016-03-03 হল ==> 368 * 2015-03-01 হল ==> -368 *

package com.bitiknow.date;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * 
 * @author pradeep
 *
 */
public class LocalDateTimeTry {
    public static void main(String[] args) {

        // Date in String format.
        String dateString = "2015-03-01";

        // Converting date to Java8 Local date
        LocalDate startDate = LocalDate.parse(dateString);
        LocalDate endtDate = LocalDate.now();
        // Range = End date - Start date
        Long range = ChronoUnit.DAYS.between(startDate, endtDate);
        System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate
                + " is  ==> " + range);

        range = ChronoUnit.DAYS.between(endtDate, startDate);
        System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString
                + " is  ==> " + range);

    }

}

7

প্রত্যেকে ChronoUnit.DAYS.between ব্যবহার করতে বলছে তবে কেবল নিজেকে অন্য কোনও পদ্ধতিতে ডেলিগেট করতে পারেন যে আপনি নিজেকে কল করতে পারেন। সুতরাং আপনি করতে পারে firstDate.until(secondDate, ChronoUnit.DAYS)

উভয়ের জন্য দস্তাবেজগুলি উভয় পদ্ধতিরই উল্লেখ করে এবং যেটি যাকে বেশি পাঠযোগ্য তা ব্যবহার করতে বলে।


এফডাব্লুআইডাব্লু ... কেন আমি দু'জনের উপস্থিতি নিশ্চিত নই এমন সময় কি আছে যেগুলি একটি আরও পঠনযোগ্য এবং অন্যটির বারের মতো? যখন / কেন?
এনএফজি

4

আপনি এখানে যান:

public class DemoDate {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("Current date: " + today);

        //add 1 month to the current date
        LocalDate date2 = today.plus(1, ChronoUnit.MONTHS);
        System.out.println("Next month: " + date2);

        // Put latest date 1st and old date 2nd in 'between' method to get -ve date difference
        long daysNegative = ChronoUnit.DAYS.between(date2, today);
        System.out.println("Days : "+daysNegative);

        // Put old date 1st and new date 2nd in 'between' method to get +ve date difference
        long datePositive = ChronoUnit.DAYS.between(today, date2);
        System.out.println("Days : "+datePositive);
    }
}

4

বর্তমান দিন থেকে ক্রিসমাসের আগের দিনগুলি পান, এটি ব্যবহার করে দেখুন

System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25)));

3

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

public long daysInBetween(java.time.LocalDate startDate, java.time.LocalDate endDate) {
  // Check for null values here

  return endDate.toEpochDay() - startDate.toEpochDay();
}

1
'পেরিওড.বিটউইন (তারিখ 1, তারিখ 2) .getDays ()' ব্যবহার করার ফাঁদে পড়ে আপনি বুঝতে পারছেন না যে আপনি কয়েক মাস এবং বছরের পার্থক্যটি আলগা করছেন।
MrSmith42

2

দুটি তারিখের মধ্যে দিন পান তারিখের উদাহরণ java.util.Date

public static long daysBetweenTwoDates(Date dateFrom, Date dateTo) {
            return DAYS.between(Instant.ofEpochMilli(dateFrom.getTime()), Instant.ofEpochMilli(dateTo.getTime()));
        }

1

আমি জানি এই প্রশ্নটি জাভা 8 এর জন্য, তবে জাভা 9 এর সাথে আপনি ব্যবহার করতে পারেন:

public static List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate) {
    return startDate.datesUntil(endDate)
      .collect(Collectors.toList());
}

0

আপনার প্রয়োজনগুলি সর্বোত্তমভাবে পূরণ করে এমন শ্রেণি বা পদ্ধতিটি ব্যবহার করুন:

  • স্থিতিকাল বর্গ,
  • পিরিয়ড ক্লাস,
  • বা ChronoUnit.between পদ্ধতি।

একটি সময়কাল সময় ভিত্তিক মানগুলি (সেকেন্ড, ন্যানোসেকেন্ডস) ব্যবহার করে সময়ের পরিমাণ পরিমাপ করে।

একটি পিরিয়ড তারিখ-ভিত্তিক মানগুলি (বছর, মাস, দিন) ব্যবহার করে।

ChronoUnit.between পদ্ধতিটি কার্যকর যখন আপনি কেবলমাত্র একক একক সময়ে যেমন সময় বা সেকেন্ডে সময় পরিমাণ পরিমাপ করতে চান।

https://docs.oracle.com/javase/tutorial/datetime/iso/period.html

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