দুটি জাভা তারিখের উদাহরণগুলির মধ্যে পার্থক্য গণনা করা হচ্ছে


433

আমি java.util.Dateস্কালায় জাভা ক্লাস ব্যবহার করছি এবং একটি Dateঅবজেক্ট এবং বর্তমান সময়ের তুলনা করতে চাই । আমি জানি আমি গেটটাইম () ব্যবহার করে ব-দ্বীপ গণনা করতে পারি:

(new java.util.Date()).getTime() - oldDate.getTime()

যাইহোক, এটি কেবল আমাকে longউপস্থাপনকারী মিলিসেকেন্ডগুলির সাথে ছেড়ে দেয়। একটি সময় ব-দ্বীপ পেতে কি আরও সহজ, সুন্দর উপায় আছে?


10
কেন জোদার সময় প্রেম নেই? আপনি জাভাতে খেজুর নিয়ে কাজ করতে যাচ্ছেন তবে এটি সর্বোত্তম বিকল্প।
ডক্টর জোনস

7
যে কোনো TimeUnit মধ্যে Joda ব্যবহার করে এবং ফলাফলের প্রদান ছাড়া আমার মার্জিত 2 মাছ ধরার নৌকা সমাধান দয়া করে চেক করুন stackoverflow.com/a/10650881/82609
সেবাস্টিয় Lorber

2
যারা জোডাকে সময় দেওয়ার পরামর্শ দেয়, এবং সত্যিকারের জাভা উত্তরের প্রস্তাব দিচ্ছে না তাদের লজ্জা ...
Zizouz212

2
@ জিজোজ ২১২ জোদা-টাইমের প্রস্তাব দেওয়ার বিষয়ে, জাভা দিয়ে তৈরি পুরাতন তারিখের ক্লাসগুলি খারাপ, প্রকৃত খারাপ, খারাপ নকশাকৃত, বিভ্রান্তিকর এবং ঝামেলাজনক। এত খারাপ যে জোদা-টাইম তাদের প্রতিস্থাপন হিসাবে বিশাল সফল হয়েছিল became এতটাই খারাপ যে এমনকি সান / ওরাকল তাদের ছেড়ে চলে গিয়েছিল এবং জাভা.টাইম প্যাকেজটি জাভা 8 এবং তার পরে হিসাবে গ্রহণ করেছে। জাভা.টাইম ক্লাসগুলি জোদা-সময় দ্বারা অনুপ্রাণিত হয়। জোদা-টাইম এবং জাভা.টাইম উভয়ের নেতৃত্বে একই ব্যক্তি স্টিফেন কলবর্ন । আমি বলব "যে কেউ লজ্জা ব্যবহার সুপারিশ Date, Calendarএবং SimpleDateFormat"।
বাসিল বাউরক

2
যখন প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তখন জোদা টাইম সম্ভবত একটি ভাল উত্তর ছিল, আজ যে কেউ জাভা 8 ব্যবহার করতে পারেন তার পক্ষে সর্বোত্তম উত্তর হ'ল ব্যবহার করা java.time.Periodএবং / অথবা Duration। দেখুন নিচের বেসিল Bourque এর উত্তর
ওলে ভিভি

উত্তর:


198

Dateদুর্ভাগ্যক্রমে জেডিকে এপিআই ভয়াবহভাবে ভেঙে গেছে। আমি জোদা টাইম লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি ।

Joda সময় সময় একটি ধারণা রয়েছে ব্যবধান :

Interval interval = new Interval(oldTime, new Instant());

সম্পাদনা করুন: যাইহোক, জোদার দুটি ধারণা রয়েছে: Intervalদুটি সময়ের তাত্ক্ষণিক সময়ের মধ্যে (সময় সকাল 8 টা এবং 10am এর মধ্যে সময় উপস্থাপন করে) এবং একটি Durationযা প্রকৃত সময়ের গণ্ডি ছাড়াই দীর্ঘ সময়ের প্রতিনিধিত্ব করে (যেমন দুটি ঘন্টা উপস্থাপন করে!)

আপনি যদি কেবল সময়ের তুলনাগুলির বিষয়ে চিন্তা করেন তবে বেশিরভাগ Dateবাস্তবায়ন (জেডিকে এক সহ) Comparableইন্টারফেস প্রয়োগ করে যা আপনাকে ব্যবহার করতে দেয়Comparable.compareTo()


বিটিডব্লিউ - আপনার মানে Comparable.compareTo(), না Comparable.compare()
স্কট মরিসন

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

জাভা 8-এ জোড়ার মতো নতুন তারিখ এবং সময় এপি রয়েছে।
tbodt

11
java.timeজাভা 8- এ নতুন প্যাকেজ জোদা-টাইমে অনুপ্রাণিত হয়েছে তবে এটি কোনও ড্রপ-ইন প্রতিস্থাপন নয়। প্রত্যেকেরই এর উপকারিতা এবং বিপরীতে রয়েছে। ভাগ্যক্রমে আপনি তাদের মধ্যে নির্বাচন করতে হবে না। যতক্ষণ আপনি আপনার importবিবৃতিতে সতর্ক হন ততক্ষণ প্রতিটি তার শক্তির জন্য ব্যবহার করুন । জাভা.টাইমের উদাহরণের জন্য এই অন্যান্য উত্তরটি দেখুন ।
বাসিল বাউরক

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

550

সাধারণ ডিফ

/**
 * Get a diff between two dates
 * @param date1 the oldest date
 * @param date2 the newest date
 * @param timeUnit the unit in which you want the diff
 * @return the diff value, in the provided unit
 */
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

এবং তারপরে আপনি কল করতে পারেন:

getDateDiff(date1,date2,TimeUnit.MINUTES);

মিনিটের ইউনিটে 2 তারিখের পার্থক্য পেতে।

TimeUnitএটি হল java.util.concurrent.TimeUnitএকটি মানক জাভা এনাম যা ন্যানো থেকে দিনগুলিতে চলছে।


মানব পাঠযোগ্য পার্থক্য (বিনা বাক্সে)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {

    long diffInMillies = date2.getTime() - date1.getTime();

    //create the list
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);

    //create the result map of TimeUnit and difference
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;

    for ( TimeUnit unit : units ) {

        //calculate difference in millisecond 
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;

        //put the result in the map
        result.put(unit,diff);
    }

    return result;
}

http://ideone.com/5dXeu6

আউটপুট হ'ল Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}ইউনিট অর্ডার সহ কিছু ।

আপনাকে কেবলমাত্র সেই মানচিত্রটিকে একটি ব্যবহারকারী-বান্ধব স্ট্রিংয়ে রূপান্তর করতে হবে।


সতর্কতা

উপরের কোড স্নিপেটগুলি 2 তাত্ক্ষণিকের মধ্যে একটি সাধারণ পার্থক্য গণনা করে। এটি একটি দিবালোক সংরক্ষণের সময় সমস্যার সৃষ্টি করতে পারে যেমন এই পোস্টে ব্যাখ্যা করা হয়েছে । এর অর্থ আপনি যদি সময় না দিয়ে তারিখের মধ্যে পার্থক্য গণনা করেন তবে আপনার অনুপস্থিত দিন / ঘন্টা থাকতে পারে।

আমার মতে তারিখের পার্থক্যটি একধরণের বিষয়গত, বিশেষত দিনগুলিতে। আপনি:

  • 24 ঘন্টা অতিবাহিত সময়ের সংখ্যা গণনা করুন: দিন + 1 - দিন = 1 দিন = 24 ঘন্টা

  • দিবালোকের সঞ্চয়ের যত্ন নেওয়ার সাথে সময় অতিবাহিত সময় গণনা করুন: দিন + 1 - দিন = 1 = 24 ঘন্টা (তবে মধ্যরাতের সময় এবং দিবালোকের সঞ্চয় ব্যবহার করে এটি 0 দিন এবং 23 ঘন্টা হতে পারে)

  • সংখ্যাটি গণনা করুন day switches, যার অর্থ দিন +1 1 বিকাল 1 - দিন 11am = 1 দিন, এমনকি অতিবাহিত সময়টি মাত্র 2 ঘন্টা (বা যদি কোনও দিবালোক সংরক্ষণ থাকে তবে 1 ঘন্টা): পি)

আমার উত্তর বৈধ যদি আপনার তারিখের সংজ্ঞা দিনগুলিতে 1 ম কেসের সাথে মেলে

জোডাটাইম সহ

আপনি যদি জোডটাইম ব্যবহার করে থাকেন তবে আপনি 2 টি তাত্ক্ষণিক (মিলি ব্যাকড রিডেবল ইনস্ট্যান্ট) তারিখগুলির সাথে আলাদা করতে পারেন:

Interval interval = new Interval(oldInstant, new Instant());

তবে আপনি স্থানীয় তারিখ / সময়গুলির জন্য পৃথকও পেতে পারেন:

// returns 4 because of the leap year of 366 days
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() 

// this time it returns 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears() 

// And you can also use these static methods
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()

বাহ, আপনি সত্যিই একটি পুরানো কুকুর নতুন কৌশল শেখাতে পারেন! এর আগে এর আগে কখনও শুনিনি, তারিখের পার্থক্যকে অর্থপূর্ণ স্ট্রিংয়ে অনুবাদ করার জন্য খুব দরকারী।
জেরেমি গুডেল

@ সেবাস্তিয়ানলবারবার এইভাবে পার্থক্য গণনা করার জন্য কি টাইম ইউনাইটে কোনও উপায় আছে? "এখন থেকে 3 দিন, 4 ঘন্টা 12 মিনিটের জন্য অ্যালার্ম সেট করা আছে"।
Likejudo

দুর্দান্ত জিনিসগুলি সত্যিই আমার প্রচুর সময় সাশ্রয় করেছে। আপনার সাহায্য তারিফ করা.
লিজু আমি এডউইনসন

আমি জাভা তারিখগুলির সাথে আচরণ করে আমার জীবনের 3 দিন নষ্ট করেছি এবং আমি কেবল এটির অনেক কিছুই ফেলে দিয়েছি এবং এটি দিয়ে প্রতিস্থাপন করেছি। ধন্যবাদ.
ব্যবহারকারী 1091524

স্ট্যাকওভারফ্লোতে আসার পর থেকে আমি এটিই দেখেছি সেরা উত্তর! : ডি: ডি: ডি
শীত

153
int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) )

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


6
এটি আসলে অ্যান্ড্রয়েডে সঠিকভাবে কাজ করে না। রাউন্ডিং ত্রুটি বিদ্যমান। উদাহরণস্বরূপ 19 শে 21 শে মে 1 দিন বলছে কারণ এটি ১.৯৯৯ থেকে ১.২ কাস্ট করে int
প্রতীক মান্দ্রেেকর

4
এটি সেরা এবং সহজ উত্তর। দুটি তারিখের মধ্যে পার্থক্যের গণনা করার সময়, স্থানীয় সময় অঞ্চলগুলি একে অপরকে বিয়োগ করে দেয় ... যাতে সঠিক উত্তরটি (দ্বিগুণ হিসাবে) কেবল ((ডাবল) (newer.getTime () - Old.getTime ()) / দ্বারা দেওয়া হয় (86400.0 * 1000.0); ... দ্বিগুণ হিসাবে, আপনার ভগ্নাংশের দিনও রয়েছে যা সহজেই এইচএইচ: এমএম: এসএস তে রূপান্তর করতে পারে
স্কটব

8
@ স্কটব: স্থানীয় তারিখগুলির সাথে সমস্যা হ'ল আপনার দিবালোকের সঞ্চয় সময় থাকতে পারে, যার অর্থ কিছু দিনের মধ্যে 23 বা 25 ঘন্টা থাকতে পারে, ফলস্বরূপ বিশৃঙ্খলা তৈরি করে।
মাইকেল বর্গওয়ার্ট

1
@ স্টিভ: এই নতুন তারিখের মতো তাদের সংজ্ঞা দেওয়ার সময় এটি আমার পক্ষে 28 (115, 2, 26); (প্যারামগুলির জন্য এপিআই ডকের দিকে মনোযোগ দিন)। আপনি কি ইউএস ডেট ফর্ম্যাট এবং লেনিয়েন্ট মোডে ব্যবহার করে তাদের পার্স করছেন, এটি 26 শে 2013/2015-এর 2015 সালের 26 তম মাসের তৃতীয় দিন হিসাবে ব্যাখ্যা করা সম্ভব?
মাইকেল বর্গওয়ার্ট

1
@ স্টিভ: এইচএম, আমি আগে কেন অন্যরকম ফলাফল পেয়েছি তা নিশ্চিত নয় তবে এখন আমি আপনার ত্রুটিটি পুনরুত্পাদন করতে পারি। আপনার কোডের ব্রেসগুলি আমার উত্তরের চেয়ে পৃথক, যা চূড়ান্ত ফলাফলের পরিবর্তে (endDate.getTime() - startDate.getTime())কাস্ট করা intহয় এবং আপনি একটি পূর্ণসংখ্যার ওভারফ্লো পেয়ে যাচ্ছেন।
মাইকেল বর্গওয়ার্ট

54

ব্যবহার java.time ফ্রেমওয়ার্ক জাভা মধ্যে 8+ নির্মিত:

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime oldDate = now.minusDays(1).minusMinutes(10);
Duration duration = Duration.between(oldDate, now);
System.out.println("ISO-8601: " + duration);
System.out.println("Minutes: " + duration.toMinutes());

আউটপুট:

আইএসও -8601: PT24H10M

মিনিট: 1450

আরও তথ্যের জন্য, ওরাকল টিউটোরিয়াল এবং আইএসও 8601 স্ট্যান্ডার্ড দেখুন।


5
এটি, বা তারিখের Periodপরিবর্তে Durationব্যবহার করুন।
অ্যাফেক্স

53

আপনার সমস্যাটি আরও স্পষ্টভাবে সংজ্ঞায়িত করা দরকার। আপনি পারে মাত্র দুই মধ্যে অনির্দিষ্ট সংখ্যা নিতে Dateবস্তু এবং ডিভাইড মিলিসেকেন্ড সংখ্যা দ্বারা 24 ঘন্টার মধ্যে, উদাহরণস্বরূপ ... কিন্তু:

  • এটি সময় অঞ্চল বিবেচনায় নেবে না - Dateসর্বদা ইউটিসিতে থাকে
  • এটি দিবালোক সংরক্ষণের সময় বিবেচনায় নেবে না (যেখানে এমন দিনগুলি থাকতে পারে যা কেবলমাত্র ২৩ ঘন্টা দীর্ঘ হয়)
  • এমনকি ইউটিসি-র মধ্যেও, 16 ই আগস্ট রাত 11 টা থেকে 18 আগস্ট 2 2 টা কত ঘন্টা আছে? এটি কেবল ২ hours ঘন্টা, তাই এর মানে কি একদিন? অথবা এটি তিন দিন হওয়া উচিত কারণ এটি তিনটি তারিখ কভার করে?

1
আমি ভাবলাম java.util। তারিখটি টাইম-মিলিস উপস্থাপনার চারদিকে কেবল একটি ছোট্ট মোড়ক ছিল, স্থানীয় (ডিফল্ট) টাইমজোন দ্বারা ব্যাখ্যা করা। তারিখ ছাপানো আমাকে স্থানীয় সময় অঞ্চল উপস্থাপন করে। আমি কি এখানে বিভ্রান্ত?
অ্যাড্রিয়ান কোস্টার

46

TL; ড

আপনার অপ্রচলিত java.util.Dateবস্তুগুলিকে তাদের প্রতিস্থাপনে রূপান্তর করুন java.time.Instant,। তারপরে অতিক্রান্ত সময়টিকে ক হিসাবে গণনা করুন Duration

Duration d = 
    Duration.between(                   // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
        myJavaUtilDate.toInstant() ,    // Convert legacy class to modern class by calling new method added to the old class.
        Instant.now()                   // Capture the current moment in UTC. About two and a half hours later in this example.
    )
;

d.toString (): PT2H34M56S

d.toMinutes (): 154

d.toMinutesPart (): 34

আইএসও 8601 ফর্ম্যাট: PnYnMnDTnHnMnS

যুক্তিসম্মত মান আইএসও 8601 সংজ্ঞায়িত বছর নম্বর হিসাবে একটি সময় বিঘত একটি সংক্ষিপ্ত পাঠগত উপস্থাপনা, মাস, দিন, ঘন্টা, ইত্যাদি মান কল যেমন যেমন একটি স্প্যান একটি সময়কাল । বিন্যাসটি PnYnMnDTnHnMnSযেখানে P"পিরিয়ড" এর অর্থ,T সময় অংশ থেকে তারিখের অংশটি পৃথক করে এবং এর মধ্যে সংখ্যার পরে একটি বর্ণ থাকে।

উদাহরণ:

  • P3Y6M4DT12H30M5S
    তিন বছর, ছয় মাস, চার দিন, বারো ঘন্টা, ত্রিশ মিনিট এবং পাঁচ সেকেন্ড
  • PT4H30M
    সাড়ে চার ঘন্টা

java.time

Java.time জাভা 8 পাতাটা এবং পরে ফ্রেমওয়ার্ক বিরক্তিজনক পুরাতন supplants java.util.Date/ java.util.Calendarক্লাস। নতুন ক্লাসগুলি অত্যন্ত সফল জোডা-টাইম কাঠামোর দ্বারা অনুপ্রাণিত হয়েছে , এর উত্তরসূরি হিসাবে ধারণা করা হয়েছে, ধারণার অনুরূপ তবে পুনরায় আর্কিটেটেড। জেএসআর 310 দ্বারা সংজ্ঞায়িত । থ্রিটেন-এক্সট্রা প্রকল্প দ্বারা প্রসারিত । টিউটোরিয়াল দেখুন

মুহূর্ত

Instantক্লাসে টাইমলাইনে একটি মুহূর্ত প্রতিনিধিত্ব করে ইউটিসি একটি রেজোলিউশনে ন্যানোসেকেন্ড (একসঙ্গে নয় জন (9) একটি দশমিক ভগ্নাংশের সংখ্যায় পর্যবসিত)।

Instant instant = Instant.now() ;  // Capture current moment in UTC.

শ্রেষ্ঠ যেমন উত্তরাধিকার শ্রেণীর এড়াতে Date/ Calendar। তবে আপনাকে যদি পুরানো কোডটি এখনও জাভা.টাইমে আপডেট না করে আন্তঃচালিত করতে হয় তবে পিছনে পিছনে রূপান্তর করুন। পুরানো ক্লাসে যুক্ত নতুন রূপান্তর পদ্ধতিগুলি কল করুন। একটি থেকে সরানোর জন্য java.util.Dateএকটি থেকে Instant, কল Date::toInstant

Instant instant = myJavaUtilDate.toInstant() ;  // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.

সময় বিঘত

জাভা.টাইম ক্লাসগুলি কয়েক বছর, মাস, দিন, ঘন্টা, মিনিট, সেকেন্ড হিসাবে সময়ের ব্যবধানকে এই দুটি ভাগে বিভক্ত করেছে:

  • Period বছর, মাস, দিন
  • Duration দিন, ঘন্টা, মিনিট, সেকেন্ডের জন্য

এখানে একটি উদাহরণ।

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );

কনসোল করতে ডাম্প।

উভয়ই Periodএবং তাদের মানটির একটি স্ট্রিং উপস্থাপনা উত্পন্ন করার জন্য আইএসও 8601 স্ট্যান্ডার্ড Durationব্যবহার করে ।

System.out.println ( "now: " + now + " to future: " + now + " = " + duration );

এখন: 2015-11-26T00: 46: 48.016-05: 00 [আমেরিকা / মন্ট্রিল] ভবিষ্যতের: 2015-11-26T00: 46: 48.016-05: 00 [আমেরিকা / মন্ট্রিল] = পিটি 1 এইচ 3 এম

জাভা 9 Durationদিনের অংশ, ঘন্টা অংশ, মিনিট অংশ এবং সেকেন্ডের অংশ পেতে পদ্ধতি যুক্ত করে ।

আপনি পুরো সময়কালে মোট দিন বা ঘন্টা বা মিনিট বা সেকেন্ড বা মিলিসেকেন্ড বা ন্যানোসেকেন্ডগুলি পেতে পারেন।

long totalHours = duration.toHours();

জাভা 9-এ Durationক্লাসটি দিন, ঘন্টা, মিনিট, সেকেন্ড, মিলিসেকেন্ড / ন্যানোসেকেন্ডের বিভিন্ন অংশ ফিরে পাওয়ার জন্য নতুন পদ্ধতি অর্জন করে। ফোন করুন to…Partপদ্ধতি: toDaysPart(), toHoursPart(), এবং তাই।

ChronoUnit

আপনি যদি কেবল সময়ের আরও বৃহত্তর গ্রানুলারিটির বিষয়ে চিন্তা করেন তবে যেমন "সময় কেটে গেছে", ChronoUnitএনাম ব্যবহার করুন ।

long daysElapsed = ChronoUnit.DAYS.between( earlier , later );

আরেকটি উদাহরণ.

Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );

long minutesElapsed = ChronoUnit.MINUTES.between( now , later );

120


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

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

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

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

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

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


Joda-টাইম

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

জোডা-টাইম লাইব্রেরিটি ডিফল্টর জন্য আইএসও 8601 ব্যবহার করে। এর Periodশ্রেণি এই PnYnMnDTnHnMnS স্ট্রিংগুলি বিশ্লেষণ করে এবং উত্পন্ন করে।

DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );

উপস্থাপন করে:

period: PT4H30M

মজার বিষয় আপনি "tl; dr" দিয়ে পাঠ্যের একটি অপ্রাসঙ্গিক থেকে প্রশ্ন-প্রাচীর শুরু করেছেন। এক্সটি থেকে টাইমস্ট্যাম্প কীভাবে পাওয়া যায় বা সময়ের এক্স ইউনিটে কীভাবে হয় তা নয়, তবে কীভাবে দুটি তারিখের মধ্যে ব-দ্বীপ পাবেন about এটাই.
মহিষ 12

@ বুফালো আমি আপনার মন্তব্য বুঝতে পারি না। আমার উত্তরে অন্তর্ভুক্ত রয়েছে Period, Durationএবং ChronoUnit, তিনটি শ্রেণি যার উদ্দেশ্য সময়ের পয়েন্টগুলির মধ্যে ব-দ্বীপ নির্ধারণ করছে। আমার "পাঠ্যের প্রাচীর" এর কোন অংশটি অপ্রাসঙ্গিক তা দয়া করে নির্দেশ করুন। এবং আপনি যে প্রশ্নটি "তারিখের মধ্যে ব-দ্বীপ" চেয়েছিলেন তা ভুল বলে মন্তব্য করেছেন: প্রশ্নটি Dateঅবজেক্টের মধ্যে একটি ব-দ্বীপের জন্য জিজ্ঞাসা করেছিল , যা শ্রেণীর দুর্ভাগ্যজনক নামকরণ সত্ত্বেও "তারিখ" নয়, তারিখের মুহুর্ত হয়।
তুলসিল বাউরক

আপনার মন্তব্যে এমন দুটি কিছুই নেই যা বিদ্যমান দুটি জাভা.ইটিল.ডেট অবজেক্টকে পরিচালনা করে। আমি আমার কোডে বিভিন্ন স্নিপেট ব্যবহার করার চেষ্টা করেছি এবং java.util.Date অবজেক্ট ব্যবহার করে এমন কিছুই খুঁজে পাই নি।
মহিষ 8

@ বুফালো ফেয়ার যথেষ্ট, সমালোচনা। আমি "tl; dr" বিভাগে কোডটি একটি java.util.Dateথেকে একটি Instant(কেবল কল .toInstant) এ রূপান্তর করেছি । এবং আমি Momentবিভাগটি যুক্ত করার জন্য ব্যাখ্যা করেছি। আপনি একজোড়া Dateঅবজেক্টের কথা উল্লেখ করেছেন , তবে আসলে প্রশ্নটি কেবল একটি বিদ্যমান বিদ্যমান Dateঅবজেক্ট ব্যবহার করে এবং তারপরে বর্তমান মুহূর্তটি ক্যাপচার করে, তাই আমিও এটি করেছি did সাহায্য করার জন্য ধন্যবাদ! টিপ: ব্যবহার ছেড়ে দিন Date- এই উত্তরাধিকারী ক্লাসগুলি সত্যই একটি ভয়াবহ জগাখিচুড়ি।
তুলসী বাউর্কে

34
Days d = Days.daysBetween(startDate, endDate);
int days = d.getDays();

https://www.joda.org/joda-time/faq.html#datediff


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

23

কিছুটা সহজ বিকল্প:

System.currentTimeMillis() - oldDate.getTime()

"ভাল" হিসাবে: ভাল, আপনার ঠিক কী প্রয়োজন? সময়ের সময়কালকে বেশ কয়েক ঘন্টা এবং দিন ইত্যাদির উপস্থাপনের ক্ষেত্রে সমস্যাটি হ'ল এটি তারিখের জটিলতার কারণে ভুল (ভুল) এবং ভুল প্রত্যাশাগুলির দিকে পরিচালিত করতে পারে (উদাহরণস্বরূপ দিবালোকের সঞ্চয়ের সময়কালের কারণে দিনগুলিতে 23 বা 25 ঘন্টা থাকতে পারে)।


22

মিলিসেকেন্ড পদ্ধতির ব্যবহার কিছু লোকেলে সমস্যা সৃষ্টি করতে পারে।

উদাহরণস্বরূপ, ধরুন, দুটি তারিখের মধ্যে পার্থক্য 03/24/2007 এবং 03/25/2007 হতে হবে 1 দিন;

যাইহোক, মিলিসেকেন্ড রুটটি ব্যবহার করে আপনি 0 দিন পাবেন, আপনি যদি যুক্তরাজ্যে এটি চালান!

/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/  
/* This method is used to find the no of days between the given dates */  
public long calculateDays(Date dateEarly, Date dateLater) {  
   return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);  
} 

এটি কার্যকর করার আরও ভাল উপায় হল java.util.Clavender ব্যবহার করা

/** Using Calendar - THE CORRECT WAY**/  
public static long daysBetween(Calendar startDate, Calendar endDate) {  
  Calendar date = (Calendar) startDate.clone();  
  long daysBetween = 0;  
  while (date.before(endDate)) {  
    date.add(Calendar.DAY_OF_MONTH, 1);  
    daysBetween++;  
  }  
  return daysBetween;  
}  

19
আপনি কি দয়া করে এই কোডটির মূল লেখক এবং তৃতীয় বাক্যটি জমা দিতে পারেন, যার ব্লগ এন্ট্রির তারিখ 2007 ?
wchargin

এটি কি কিছুটা অকার্যকর নয়?
গাংনুস

এটি সঠিকভাবে কাজ করে না। দিনকালীন (নতুন গ্রেগরিয়ানক্যালেন্ডার (2014,03,01), নতুন গ্রেগরিয়ানক্যালেন্ডার (2014,04,02)); : আয় 31, এবং এটি 32 ফেরত পাঠাবেন timeanddate.com/date/...
marcolopes

5
@ মার্কোলপস - আপনি ভুল - কারণ ক্যালেন্ডার মাসগুলি শূন্য ভিত্তিক। আমি নিশ্চিত করুন যে আপনি মার্চ / এপ্রিল অর্থ করছি, কিন্তু কি তুমি পরীক্ষামূলক এপ্রিল / জুন যা 31 হল নিরাপদ লেখ এটা পছন্দ হতে হয় -> নতুন GregorianCalendar (2014, Calendar.MARCH, 1) ....
চাচা ইরোহ

@ ইউনস্লিওরোহ, আপনি ঠিক বলেছেন! আমি সেই গুরুত্বপূর্ণ তথ্যটি মিস করেছি (ক্যালেন্ডার মাসগুলি শূন্য ভিত্তিক)। আমাকে আবার এই প্রশ্নটি পর্যালোচনা করতে হবে।
মার্কোলোপস

22

তারিখ এবং সময়ের মধ্যে পার্থক্য খুঁজে পেতে বিভিন্ন উপায় রয়েছে। আমার জানা সবচেয়ে সহজ উপায় হ'ল:

      Calendar calendar1 = Calendar.getInstance();
      Calendar calendar2 = Calendar.getInstance();
      calendar1.set(2012, 04, 02);
      calendar2.set(2012, 04, 04);
      long milsecs1= calendar1.getTimeInMillis();
      long milsecs2 = calendar2.getTimeInMillis();
      long diff = milsecs2 - milsecs1;
      long dsecs = diff / 1000;
      long dminutes = diff / (60 * 1000);
      long dhours = diff / (60 * 60 * 1000);
      long ddays = diff / (24 * 60 * 60 * 1000);

      System.out.println("Your Day Difference="+ddays);

মুদ্রণ বিবৃতিটি কেবল একটি উদাহরণ - আপনি এটি পছন্দ করতে পারেন, আপনি এটি বিন্যাস করতে পারেন।


5
@ মনোজ কুমার বর্ধন: ওভারফ্লো স্ট্যাক করার জন্য আপনাকে স্বাগতম: আপনি দেখুন প্রশ্নোত্তর বহু বছরের পুরনো। আপনার উত্তরটি বিদ্যমান উত্তরগুলির চেয়ে প্রশ্ন / উত্তরে আরও যুক্ত করা উচিত।
জয়ন

3
ডিএসটি স্থানান্তরের কারণে যে দিনগুলিতে 23 বা 25 ঘন্টা থাকে সেগুলি সম্পর্কে কী বলা যায়?
জনি

19

যেহেতু এখানে সমস্ত উত্তর সঠিক রয়েছে তবে উত্তরাধিকারী জাভা বা তৃতীয় পক্ষের লিবস যেমন জোদা বা অনুরূপ ব্যবহার করুন, আমি জাভা 8 এবং তার পরে নতুন জাভা.টাইম ক্লাসগুলি ব্যবহার করে অন্য কোনও উপায় ছাড়বওরাকল টিউটোরিয়াল দেখুন ।

ব্যবহার করুন LocalDateএবং ChronoUnit:

LocalDate d1 = LocalDate.of(2017, 5, 1);
LocalDate d2 = LocalDate.of(2017, 5, 18);

long days = ChronoUnit.DAYS.between(d1, d2);
System.out.println( days );

9

মিলিসেকেন্ড কাজে তারিখ বিয়োগ (অন্য পোস্টে বর্ণনা অনুযায়ী), কিন্তু আপনি আছে যখন আপনার তারিখ সময় অংশের ক্লিয়ারিং HOUR_OF_DAY এবং না কেয়ামত ব্যবহার করার জন্য:

public static final long MSPERDAY = 60 * 60 * 24 * 1000;
...
final Calendar dateStartCal = Calendar.getInstance();
dateStartCal.setTime(dateStart);
dateStartCal.set(Calendar.HOUR_OF_DAY, 0); // Crucial.
dateStartCal.set(Calendar.MINUTE, 0);
dateStartCal.set(Calendar.SECOND, 0);
dateStartCal.set(Calendar.MILLISECOND, 0);
final Calendar dateEndCal = Calendar.getInstance();
dateEndCal.setTime(dateEnd);
dateEndCal.set(Calendar.HOUR_OF_DAY, 0); // Crucial.
dateEndCal.set(Calendar.MINUTE, 0);
dateEndCal.set(Calendar.SECOND, 0);
dateEndCal.set(Calendar.MILLISECOND, 0);
final long dateDifferenceInDays = ( dateStartCal.getTimeInMillis()
                                  - dateEndCal.getTimeInMillis()
                                  ) / MSPERDAY;
if (dateDifferenceInDays > 15) {
    // Do something if difference > 15 days
}

1
স্ট্যান্ডার্ড লাইব্রেরির বাইরে না গিয়ে দুটি ক্যালেন্ডারের তারিখের মধ্যে পার্থক্য নির্ধারণের এটি সেরা পদ্ধতি। অন্যান্য উত্তরগুলির বেশিরভাগই একদিনকে 24 ঘন্টা সময় নির্বিচারে গণ্য করে। লিপ সেকেন্ড যোগ করার পরিবর্তে যদি সর্বদা বিয়োগ করতে হয়, তবে চূড়ান্ত গণনাটি কাটা কাটার কারণে একে একে বন্ধ হয়ে যেতে পারে, যেহেতু পরম পার্থক্যটি MSPERDAY এর পুরো সংখ্যার চেয়ে কিছু কম হতে পারে।
জুলিয়ানসাইমস

8

আপনি যদি জোডটাইম বা অনুরূপ ব্যবহার করতে না চান তবে সর্বোত্তম সমাধান সম্ভবত এটি হ'ল:

final static long MILLIS_PER_DAY = 24 * 3600 * 1000;
long msDiff= date1.getTime() - date2.getTime();
long daysDiff = Math.round(msDiff / ((double)MILLIS_PER_DAY));

প্রতিদিনের এমএসের সংখ্যা সর্বদা এক রকম হয় না (কারণ দিবালোক সাশ্রয় সময় এবং লিপ সেকেন্ডের কারণে) তবে এটি খুব কাছাকাছি এবং দিবালোকের সময় সাশ্রয়ের কারণে কমপক্ষে বিচ্যুতি দীর্ঘ সময়ের জন্য বাতিল হয়ে যায়। সুতরাং বিভাজন এবং তারপরে রাউন্ডিং একটি সঠিক ফলাফল দেবে (যতক্ষণ না ব্যবহৃত স্থানীয় ক্যালেন্ডারে ডিএসটি এবং লিপ সেকেন্ড ব্যতীত অদ্ভুত সময়ের ধাঁধা থাকে না)।

দ্রষ্টব্য যে এটি এখনও ধরে নেয় date1এবং date2দিনের একই সময়ে সেট করা থাকে। দিনের বিভিন্ন সময়ে, আপনাকে প্রথমে "তারিখের পার্থক্য" এর অর্থ কী তা বোঝাতে হবে, যেমন জোন স্কিট নির্দেশ করেছেন।


বিষয়টি date1.getTime()বনামে indate2.getTime() । সুতরাং 2016-03-03 থেকে 2016-03-31 এর মধ্যে পার্থক্য থাকা 27 দিন গণনা করবে যখন আপনি 28 দিন চান।
ম্যালাত

@ মালাত: দুঃখিত, আমি অনুসরণ করতে পারি না। আমি কেবল এটি চেষ্টা করেছি - আমার কোড গণনা সহ ২৮ দিনের মধ্যে 2016-03-03 থেকে 2016-03-31 এর মধ্যে পৃথক। যদি এটি আপনার উদাহরণে অন্য কিছু গণনা করে তবে এটিকে আলাদা প্রশ্ন হিসাবে জিজ্ঞাসা করুন consider
সলেসকে

এছাড়াও, আপনি আমার ক্যাব্যাট পড়েন? "এটি এখনও ধরে নেয় যে তারিখ 1 এবং তারিখ 2 দিনের একই সময়ে সেট করা আছে"। আপনি সম্ভবত আপনার পরীক্ষায় দিনের বিভিন্ন সময় ব্যবহার করেছেন?
সলেসকে

আহ ঠিক ! আমি এই কৌশলটি মিস করেছি Math.round(), এটি 'রিয়েল ওয়ার্ল্ড' ক্যালেন্ডারে নিরাপদ বলে মনে হচ্ছে। গোলমাল জন্য দুঃখিত।
মালাত

8

কটাক্ষপাত Joda সময় , যা জাভা জন্য একটি উন্নত তারিখ / সময় এপিআই এবং Scala এর সঙ্গে সুন্দর কাজ করা উচিত নয়।


জাভা.টাইম (JSR-310) দ্বারা জাভা 8-এ প্রতিস্থাপন
ম্যালাত

5

আমাকে জোদা অন্তর এবং দিনগুলির মধ্যে পার্থক্য দেখাতে দিন:

DateTime start = new DateTime(2012, 2, 6, 10, 44, 51, 0);
DateTime end = new DateTime(2012, 2, 6, 11, 39, 47, 1);
Interval interval = new Interval(start, end);
Period period = interval.toPeriod();
System.out.println(period.getYears() + " years, " + period.getMonths() + " months, " + period.getWeeks() + " weeks, " + period.getDays() + " days");
System.out.println(period.getHours() + " hours, " + period.getMinutes() + " minutes, " + period.getSeconds() + " seconds ");
//Result is:
//0 years, 0 months, *1 weeks, 1 days*
//0 hours, 54 minutes, 56 seconds 

//Period can set PeriodType,such as PeriodType.yearMonthDay(),PeriodType.yearDayTime()...
Period p = new Period(start, end, PeriodType.yearMonthDayTime());
System.out.println(p.getYears() + " years, " + p.getMonths() + " months, " + p.getWeeks() + " weeks, " + p.getDays() + "days");
System.out.println(p.getHours() + " hours, " + p.getMinutes() + " minutes, " + p.getSeconds() + " seconds ");
//Result is:
//0 years, 0 months, *0 weeks, 8 days*
//0 hours, 54 minutes, 56 seconds 

5

আপনার যদি "2 দিন 03h 42m 07s" এর মতো ফর্ম্যাট ফিরতি স্ট্রিংয়ের দরকার হয় তবে এটি ব্যবহার করে দেখুন:

public String fill2(int value)
{
    String ret = String.valueOf(value);

    if (ret.length() < 2)
        ret = "0" + ret;            
    return ret;
}

public String get_duration(Date date1, Date date2)
{                   
    TimeUnit timeUnit = TimeUnit.SECONDS;

    long diffInMilli = date2.getTime() - date1.getTime();
    long s = timeUnit.convert(diffInMilli, TimeUnit.MILLISECONDS);

    long days = s / (24 * 60 * 60);
    long rest = s - (days * 24 * 60 * 60);
    long hrs = rest / (60 * 60);
    long rest1 = rest - (hrs * 60 * 60);
    long min = rest1 / 60;      
    long sec = s % 60;

    String dates = "";
    if (days > 0) dates = days + " Days ";

    dates += fill2((int) hrs) + "h ";
    dates += fill2((int) min) + "m ";
    dates += fill2((int) sec) + "s ";

    return dates;
}

2
ওহ, জোদা-টাইম ইতিমধ্যে লিখিত এবং ডিবাগ করা পিরিয়ড ক্লাস সরবরাহ করে কেন আপনার নিজের রোল করবেন ?
বাসিল বাউর্কে

8
আমার কেন কেবলমাত্র ৩২ টি লাইনের কোডের প্রয়োজন হলে আমি কেন 4.1 এমবি সংক্ষেপিত ফাইলসাইজ সহ একটি লাইব্রেরি ডাউনলোড করব এবং এটি আমার প্রকল্পে যুক্ত করব?
ইনগো

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

আপনার সমস্ত কোড পরীক্ষা করা হয় না। stdউপরে অপরিজ্ঞাত।
তুলসী বাউর্কে

@ বাসিল বাউর্ক: ইঙ্গিতটির জন্য ধন্যবাদ আমি উত্সটি প্রস্তুত করেছি এই ত্রুটিটি অনুবাদ থেকে ইংরেজিতে এসেছিল।
ইঙ্গো

5

দ্রষ্টব্য: শুরুর তারিখ এবং শেষ তারিখগুলি হ'ল -> java.util.Date

import org.joda.time.Duration;
import org.joda.time.Interval;
// Use .getTime() unless it is a joda DateTime object
Interval interval = new Interval(startDate.getTime(), endDate.getTime());
Duration period = interval.toDuration();
//gives the number of days elapsed between start 
period.getStandardDays();

এবং শেষ তারিখ

দিনের মতো, আপনি ঘন্টা, মিনিট এবং সেকেন্ডও পেতে পারেন

period.getStandardHours();
period.getStandardMinutes();
period.getStandardSeconds();

4

এখানে http://www.roseindia.net/java/beginners/DateDifferent.shtml উদাহরণ চেক করুন এই উদাহরণটি আপনাকে দিন, ঘন্টা, মিনিট, সেকেন্ড এবং মিলি সেকেন্ডের পার্থক্য দেয় :)।

import java.util.Calendar;
import java.util.Date;

public class DateDifferent {
    public static void main(String[] args) {
        Date date1 = new Date(2009, 01, 10);
        Date date2 = new Date(2009, 07, 01);
        Calendar calendar1 = Calendar.getInstance();
        Calendar calendar2 = Calendar.getInstance();
        calendar1.setTime(date1);
        calendar2.setTime(date2);
        long milliseconds1 = calendar1.getTimeInMillis();
        long milliseconds2 = calendar2.getTimeInMillis();
        long diff = milliseconds2 - milliseconds1;
        long diffSeconds = diff / 1000;
        long diffMinutes = diff / (60 * 1000);
        long diffHours = diff / (60 * 60 * 1000);
        long diffDays = diff / (24 * 60 * 60 * 1000);
        System.out.println("\nThe Date Different Example");
        System.out.println("Time in milliseconds: " + diff + " milliseconds.");
        System.out.println("Time in seconds: " + diffSeconds + " seconds.");
        System.out.println("Time in minutes: " + diffMinutes + " minutes.");
        System.out.println("Time in hours: " + diffHours + " hours.");
        System.out.println("Time in days: " + diffDays + " days.");
    }
}

3
-1 তারিখটি উদাহরণগুলি ইউটিসি সময় থেকে নেওয়া না হলে এটি ভুল। জন স্কিটির উত্তর দেখুন।
sleske

4

ক্যালেন্ডারের উদাহরণ পেতে GMT সময় অঞ্চলটি ব্যবহার করুন, ক্যালেন্ডার শ্রেণীর সেট পদ্ধতি ব্যবহার করে সময় নির্ধারণ করুন। GMT টাইমজোনটিতে 0 অফসেট রয়েছে (সত্যই গুরুত্বপূর্ণ নয়) এবং দিবালোক সংরক্ষণের সময় পতাকাটিকে মিথ্যাতে সেট করা হয়েছে।

    final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

    cal.set(Calendar.YEAR, 2011);
    cal.set(Calendar.MONTH, 9);
    cal.set(Calendar.DAY_OF_MONTH, 29);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    final Date startDate = cal.getTime();

    cal.set(Calendar.YEAR, 2011);
    cal.set(Calendar.MONTH, 12);
    cal.set(Calendar.DAY_OF_MONTH, 21);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    final Date endDate = cal.getTime();

    System.out.println((endDate.getTime() - startDate.getTime()) % (1000l * 60l * 60l * 24l));

মিলিসেকেন্ড অংশটি শূন্য করতে ভুলবেন না অন্যথায় এটি পুরানো শ্রেণি java.util.Dateইত্যাদির প্রসঙ্গে একটি ভাল উত্তর etc. জিএমটি-তে সময় অঞ্চল নির্ধারণ করতে হ্যাক ব্যবহার করা কোডটিকে দিবালোকের প্রভাবের জন্য সংবেদনশীল করে তোলে।
মেনো হচসচাইল্ড

4

নিম্নলিখিত কোড আপনাকে পছন্দসই আউটপুট দিতে পারে:

String startDate = "Jan 01 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy");
LocalDate date = LocalDate.parse(startDate, formatter);

String currentDate = "Feb 11 2015";
LocalDate date1 = LocalDate.parse(currentDate, formatter);

System.out.println(date1.toEpochDay() - date.toEpochDay());

3
আপনার কোডটি ঠিক কী ব্যাখ্যা করতে পারে? প্রশ্নটি মনে হচ্ছে কোনও সময় ব-দ্বীপ সম্পর্কে জিজ্ঞাসা করছে এবং প্রথম নজরে আপনার কোডটি কোনও দিনের ব-দ্বীপটি ফিরে আসবে বলে মনে হচ্ছে?
জিএইচসি

4
public static String getDifferenceBtwTime(Date dateTime) {

    long timeDifferenceMilliseconds = new Date().getTime() - dateTime.getTime();
    long diffSeconds = timeDifferenceMilliseconds / 1000;
    long diffMinutes = timeDifferenceMilliseconds / (60 * 1000);
    long diffHours = timeDifferenceMilliseconds / (60 * 60 * 1000);
    long diffDays = timeDifferenceMilliseconds / (60 * 60 * 1000 * 24);
    long diffWeeks = timeDifferenceMilliseconds / (60 * 60 * 1000 * 24 * 7);
    long diffMonths = (long) (timeDifferenceMilliseconds / (60 * 60 * 1000 * 24 * 30.41666666));
    long diffYears = (long)(timeDifferenceMilliseconds / (1000 * 60 * 60 * 24 * 365));

    if (diffSeconds < 1) {
        return "one sec ago";
    } else if (diffMinutes < 1) {
        return diffSeconds + " seconds ago";
    } else if (diffHours < 1) {
        return diffMinutes + " minutes ago";
    } else if (diffDays < 1) {
        return diffHours + " hours ago";
    } else if (diffWeeks < 1) {
        return diffDays + " days ago";
    } else if (diffMonths < 1) {
        return diffWeeks + " weeks ago";
    } else if (diffYears < 12) {
        return diffMonths + " months ago";
    } else {
        return diffYears + " years ago";
    }
}   

3
int daysDiff = (date1.getTime() - date2.getTime()) / MILLIS_PER_DAY;

5
-1 তারিখটি উদাহরণগুলি ইউটিসি সময় থেকে নেওয়া না হলে এটি ভুল। জন স্কিটির উত্তর দেখুন।
sleske

5
@ সালস্ক আপনি ঠিক নেই তিনি ইতিমধ্যে ব্যবহার করে টাইমজোন তথ্য হারিয়ে ফেলেছেন Date, সুতরাং এই তুলনাটি সর্বোত্তম যা পরিস্থিতি বিবেচনা করে অর্জন করা যায়।
বোঝো

1
ঠিক আছে, অনুমান করি আমরা দুজনেই ঠিক আছি এটি সত্য যে তারিখের উদাহরণটি কোথা থেকে এসেছে তা নির্ভর করে। তবুও, এটি এত সাধারণ ভুল যে এটি উল্লেখ করা উচিত।
সেলসেকে

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

3

করণীয় সেরা

(Date1-Date2)/86 400 000 

এই সংখ্যাটি মিলিসেকেন্ডের সংখ্যা একদিনে ।

একটি তারিখ-অন্যান্য তারিখ আপনাকে মিলিসেকেন্ডে পার্থক্য দেয়।

ডাবল ভেরিয়েবলের উত্তর সংগ্রহ করুন ।


হ্যাঁ না কেন? আমি প্রশ্নটির বিন্দুটি কিছু উপায়ে বুঝতে পারি না: এমপিতে ওপির পার্থক্য রয়েছে ... এবং একদিনে নির্দিষ্ট পরিমাণে এমএস থাকে (নীল চাঁদে একবার জ্যোতির্বিজ্ঞানের সামঞ্জস্য সহ ঠিক আছে, তবে ওপি কিছু করে না 'এটি বলবেন না যে এটি জ্যোতির্বিদদের যেমন প্রয়োজন ঠিক ততটাই যথাযথ হওয়া উচিত ...)
মাইকে রডেন্ট

3

কোনও নির্ভরতা ছাড়াই এখানে ও (1) এ একটি জাভা 7 সমাধান রয়েছে's

public static int countDaysBetween(Date date1, Date date2) {

    Calendar c1 = removeTime(from(date1));
    Calendar c2 = removeTime(from(date2));

    if (c1.get(YEAR) == c2.get(YEAR)) {

        return Math.abs(c1.get(DAY_OF_YEAR) - c2.get(DAY_OF_YEAR)) + 1;
    }
    // ensure c1 <= c2
    if (c1.get(YEAR) > c2.get(YEAR)) {
        Calendar c = c1;
        c1 = c2;
        c2 = c;
    }
    int y1 = c1.get(YEAR);
    int y2 = c2.get(YEAR);
    int d1 = c1.get(DAY_OF_YEAR);
    int d2 = c2.get(DAY_OF_YEAR);

    return d2 + ((y2 - y1) * 365) - d1 + countLeapYearsBetween(y1, y2) + 1;
}

private static int countLeapYearsBetween(int y1, int y2) {

    if (y1 < 1 || y2 < 1) {
        throw new IllegalArgumentException("Year must be > 0.");
    }
    // ensure y1 <= y2
    if (y1 > y2) {
        int i = y1;
        y1 = y2;
        y2 = i;
    }

    int diff = 0;

    int firstDivisibleBy4 = y1;
    if (firstDivisibleBy4 % 4 != 0) {
        firstDivisibleBy4 += 4 - (y1 % 4);
    }
    diff = y2 - firstDivisibleBy4 - 1;
    int divisibleBy4 = diff < 0 ? 0 : diff / 4 + 1;

    int firstDivisibleBy100 = y1;
    if (firstDivisibleBy100 % 100 != 0) {
        firstDivisibleBy100 += 100 - (firstDivisibleBy100 % 100);
    }
    diff = y2 - firstDivisibleBy100 - 1;
    int divisibleBy100 = diff < 0 ? 0 : diff / 100 + 1;

    int firstDivisibleBy400 = y1;
    if (firstDivisibleBy400 % 400 != 0) {
        firstDivisibleBy400 += 400 - (y1 % 400);
    }
    diff = y2 - firstDivisibleBy400 - 1;
    int divisibleBy400 = diff < 0 ? 0 : diff / 400 + 1;

    return divisibleBy4 - divisibleBy100 + divisibleBy400;
}


public static Calendar from(Date date) {

    Calendar c = Calendar.getInstance();
    c.setTime(date);

    return c;
}


public static Calendar removeTime(Calendar c) {

    c.set(HOUR_OF_DAY, 0);
    c.set(MINUTE, 0);
    c.set(SECOND, 0);
    c.set(MILLISECOND, 0);

    return c;
}

2

এটি সম্ভবত এটি করার সবচেয়ে সহজ উপায় - সম্ভবত এটি কারণ আমি জাভাতে কোডিং করে যাচ্ছি (এর স্বীকৃতিস্বরূপ খ্যাতিমান তারিখ এবং সময় লাইব্রেরি সহ) কিছু সময়ের জন্য, তবে সেই কোডটি আমার কাছে "সহজ এবং সুন্দর" দেখাচ্ছে!

ফলটি মিলি সেকেন্ডে ফিরে আসায় আপনি কি খুশি, বা আপনার প্রশ্নের অংশ যে আপনি এটি কোনও বিকল্প ফর্ম্যাটে ফিরে আসতে পছন্দ করবেন?


2

স্ট্যান্ডার্ড এপিআই ব্যবহার করছে না, না। আপনি নিজের কাজটি করে নিজের মতো করে রোল করতে পারেন:

class Duration {
    private final TimeUnit unit;
    private final long length;
    // ...
}

অথবা আপনি জোদা ব্যবহার করতে পারেন :

DateTime a = ..., b = ...;
Duration d = new Duration(a, b);

2

শুধু প্রাথমিক প্রশ্নের উত্তর দিতে:

লং গেটএজ () {like এর মতো ফাংশনে নিম্নলিখিত কোডটি রাখুন

Date dahora = new Date();
long MillisToYearsByDiv = 1000l *60l * 60l * 24l * 365l;
long javaOffsetInMillis = 1990l * MillisToYearsByDiv;
long realNowInMillis = dahora.getTime() + javaOffsetInMillis;
long realBirthDayInMillis = this.getFechaNac().getTime() + javaOffsetInMillis;
long ageInMillis = realNowInMillis - realBirthDayInMillis;

return ageInMillis / MillisToYearsByDiv;

এখানে সর্বাধিক গুরুত্বপূর্ণ হ'ল গুণ এবং ভাগ করার সময় দীর্ঘ সংখ্যা নিয়ে কাজ করা। এবং অবশ্যই, অফসেট যা জাভা তার তারিখগুলির ক্যালকুলাসে প্রয়োগ করে।

:)


2

যেহেতু প্রশ্নটি স্কালার সাথে ট্যাগ করা হয়েছে,

import scala.concurrent.duration._
val diff = (System.currentTimeMillis() - oldDate.getTime).milliseconds
val diffSeconds = diff.toSeconds
val diffMinutes = diff.toMinutes
val diffHours = diff.toHours
val diffDays = diff.toDays

2

অন্যান্য সমস্ত উত্তরের মাধ্যমে জাডিয়া পরে জাভা Date তারিখের ধরণ রাখুন তবে জাভা 8 ডিফার পদ্ধতির সাথে আরও সুনির্দিষ্ট / মানক হয়ে উঠুন,

public static long daysBetweenDates(Date d1, Date d2) {
    Instant instant1 = d1.toInstant();
    Instant instant2 = d2.toInstant();
    long diff = ChronoUnit.DAYS.between(instant1, instant2);
    return diff;
}

1

এটা চেষ্টা কর:

int epoch = (int) (new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970  00:00:00").getTime() / 1000);

আপনি পার্স () পদ্ধতি প্যারামে স্ট্রিংটি সম্পাদনা করতে পারেন।

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