জাভা ক্যালেন্ডার ব্যবহার করে কোনও তারিখ থেকে এক্স দিনকে কীভাবে বিয়োগ করবেন?


179

তারিখের থেকে X দিনগুলি বিয়োগ করতে জাভা ক্যালেন্ডার ব্যবহার করে কেউ সহজ উপায় জানেন?

আমি এমন কোনও ক্রিয়াকলাপ খুঁজে পাইনি যা জাভাতে একটি তারিখ থেকে আমাকে সরাসরি এক্স দিন বিয়োগ করতে দেয়। কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে?


এফওয়াইআই, জাভা.টাইম ক্লাসগুলির দ্বারা দমনকৃত পুরানো ডেট-টাইম ক্লাসগুলি যেমন java.util.Calendarএখন লিগ্যাসিওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বেসিল Bourque

উত্তর:


307

এখানে ডক্স থেকে নেওয়া :

ক্যালেন্ডারের নিয়মের ভিত্তিতে প্রদত্ত ক্যালেন্ডার ক্ষেত্রে নির্দিষ্ট সময়কে যোগ বা বিয়োগ করে। উদাহরণস্বরূপ, ক্যালেন্ডারের বর্তমান সময় থেকে 5 দিন বিয়োগ করতে, আপনি কল করে এটি অর্জন করতে পারেন:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

1
এটি করার ক্ষেত্রে কেবল সতর্কতা অবলম্বন করুন যেহেতু এটি আপনি যেমন আশা করেন ঠিক তেমন ঘূর্ণায়মান হয় না।
কারসন

1
এই উত্তরের অনেকগুলি উর্ধ্বতন রয়েছে তবে এটি কি নিরাপদ? অথবা এটি আরও ভাল: স্ট্যাকওভারফ্লো.com
10796111

44
আপনি Calendar.DAY_OF_MONTHএই ক্ষেত্রে ব্যবহার করবেন না কারণ এটি আপনার পছন্দ মতো কয়েক মাসের মধ্যে রোলটি পরিচালনা করবে না। Calendar.DAY_OF_YEARপরিবর্তে ব্যবহার করুন
অ্যালগরিদমগুলি

4
এই নিরাপদ হওয়া উচিত, দৃশ্যত যখন আপনি এটি যোগ করছি নেই ব্যাপার যদি এটা হওয়ার DAY_OF_MONTH বা হওয়ার DAY_OF_YEAR stackoverflow.com/q/14065198/32453
rogerdpack

@ কারসন এই পদ্ধতির সাথে কিছু সমস্যা কি?
tatmanblue

38

আপনি addপদ্ধতিটি ব্যবহার করতে পারেন এবং এটি একটি নেতিবাচক সংখ্যাটি পাস করতে পারেন । তবে আপনি এমন একটি সহজ পদ্ধতিও লিখতে পারেন Calendarযা নীচের মতো শ্রেণিটি ব্যবহার করে না

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

এটি তারিখের টাইমস্ট্যাম্প মান (যুগের পর থেকে মিলিসেকেন্ড) পায় এবং যথাযথ সংখ্যক মিলিসেকেন্ড যুক্ত করে। বিয়োগফলগুলি করতে আপনি প্যারামিটারের জন্য একটি নেতিবাচক পূর্ণসংখ্যার পাস করতে পারেন। এটি "যথাযথ" ক্যালেন্ডার সমাধানের চেয়ে সহজ হবে:

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

নোট করুন যে এই উভয় সমাধানই Dateসম্পূর্ণ নতুন ফিরে আসার পরিবর্তে পরামিতি হিসাবে পাস করা অবজেক্টটিকে পরিবর্তন করে Date। হয় ফাংশন সহজেই অন্যভাবে এটি পরিবর্তন করতে পারে যদি ইচ্ছা হয়।


3
বিশ্বাস করবেন না। সেটটাইম এবং .এডিডি ক্যালেন্ডারের স্থির পদ্ধতি। আপনি উদাহরণ পরিবর্তনশীল সি ব্যবহার করা উচিত।
এডওয়ার্ড

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

3
প্রথম পথ সঙ্গে সতর্কতা অবলম্বন করা আবশ্যক, উদাহরণস্বরূপ যখন leapyear দিন সঙ্গে তার আচরণ এটা ব্যর্থ হতে পারে: stackoverflow.com/a/1006388/32453
rogerdpack

এফওয়াইআই, জাভা.টাইম ক্লাসগুলির দ্বারা দমনকৃত পুরানো ডেট-টাইম ক্লাসগুলি যেমন java.util.Calendarএখন লিগ্যাসিওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
বেসিল Bourque

36

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

জোদা সময় এফওয়াইআই আপনি করতে পারেন

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

1
@ShahzadImam, খুঁজে বার করো DateTimeFormat । এটি আপনাকে স্বেচ্ছাসেবী বিন্যাসগুলি ব্যবহার করে ডেটটাইম দৃষ্টান্তগুলিকে স্ট্রিংগুলিতে রূপান্তর করতে দেয়। এটি জাভা.টেক্সট.ডেটফর্ম্যাট ক্লাসের সাথে খুব মিল।
মাইক ডেক

1
জাভা 8 হিসাবে java.time ডকস.অরাকল.
api

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

19

TL; ড

LocalDate.now().minusDays( 10 )

সময় অঞ্চল নির্দিষ্ট করা ভাল।

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

বিস্তারিত

পুরানো ডেট-টাইম ক্লাসগুলি জাভা-র প্রাথমিক সংস্করণগুলির সাথে বান্ডিল করা, যেমন java.util.Date/ .Calendar, ঝামেলা, বিভ্রান্তিকর এবং ত্রুটিযুক্ত বলে প্রমাণিত হয়েছে। এগুলি এড়িয়ে চলুন।

java.time

জাভা 8 এবং পরবর্তীকালে সেই পুরানো ক্লাসগুলি নতুন জাভা.টাইম ফ্রেমওয়ার্কের সাহায্যে সরবরাহ করে। টিউটোরিয়াল দেখুন । জেএসআর 310 দ্বারা সংজ্ঞায়িত , জোদা-টাইম দ্বারা অনুপ্রাণিত এবং থ্রিটেন-অতিরিক্ত প্রকল্প দ্বারা প্রসারিত । থ্রিটেন-ব্যাকপোর্ট প্রকল্পটি জাভা 6 & 7 এ ক্লাসগুলি ব্যাক-পোর্ট করে; অ্যান্ড্রয়েডে থ্রিটিএনএবিপি প্রকল্প।

প্রশ্নটি অস্পষ্ট, এটি কেবলমাত্র তারিখের জন্য বা তারিখ-সময় চাইলে পরিষ্কার হয় না।

LocalDate

কেবলমাত্র তারিখের জন্য, দিনের সময় ব্যতীত LocalDateক্লাসটি ব্যবহার করুন । নোট করুন যে একটি সময় অঞ্চল যেমন "আজ" হিসাবে একটি তারিখ নির্ধারণে গুরুত্বপূর্ণ in

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

যদি আপনি কোনও তারিখ-সময় বোঝাতে চান, তবে ইউটিসিতেInstant সময়রেখায় একটি মুহূর্ত পেতে ক্লাসটি ব্যবহার করুন । সেখান থেকে কোনও অবজেক্ট পেতে একটি সময় জোনে সামঞ্জস্য করুন ।ZonedDateTime

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

জাভাতে আধুনিক এবং উত্তরাধিকার উভয়ই তারিখের সময়ের ধরণের সারণী।


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

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

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

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

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

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

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


অন্যান্য বিকল্পগুলির তুলনায় এটি আরও উন্নততর উন্নতি (এটি আরও নতুন এবং নতুন পদ্ধতি ব্যবহার করে)। আপনি যদি এখনই এই সমস্যাটি ঘুরে দেখছেন তবে এটি যাওয়ার উপায়।
শৌর্য বানসাল


5

addDaysএলির পরামর্শ অনুযায়ী আমার নিজের লেখার পরিবর্তে , আমি আপাচিDateUtils থেকে ব্যবহার করতে পছন্দ করব । বিশেষত যখন আপনার প্রকল্পে এটি একাধিক জায়গা ব্যবহার করতে হয় তখন এটি কার্যকর It

এপিআই বলে:

addDays(Date date, int amount)

একটি নতুন অবজেক্ট ফিরিয়ে আনার তারিখে বেশ কয়েকটি দিন যুক্ত করে।

দ্রষ্টব্য যে এটি একটি নতুন Dateঅবজেক্ট রিটার্ন করে এবং পূর্ববর্তীটিতে নিজেই পরিবর্তন করে না।


2

এটি নিম্নলিখিত দ্বারা সহজেই করা যেতে পারে

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

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

1

কেউ জোদা সময়কে সুপারিশ করেছেন - আমি এই ক্যালেন্ডার তারিখ শ্রেণিটি ব্যবহার করছি http://cenderardate.sourceforge.net

এটি জোদা সময়ের প্রতি কিছুটা প্রতিদ্বন্দ্বী প্রকল্প, তবে এটি কেবলমাত্র 2 ক্লাসে অনেক বেশি বেসিক। এটি আমার পক্ষে প্রজেক্টের চেয়ে বড় কোনও প্যাকেজটি ব্যবহার করতে চাই না বলে আমার প্রয়োজনের জন্য এটি খুব সহজ এবং দুর্দান্ত কাজ করেছে। জাভা অংশগুলির মতো নয়, এর ক্ষুদ্রতম ইউনিটটি সেদিন তাই এটি সত্যই একটি তারিখ (এটি মিলিসেকেন্ড বা কোনও কিছুর সাথে নিচে নেই)। আপনি একবার তারিখটি তৈরি করলে, আপনি বিয়োগ করতে যা কিছু করেন তা হ'ল myDay.addDays (-5) এর 5 দিন পিছনে যেতে হবে। আপনি সপ্তাহের দিন এবং এর মতো জিনিসগুলি খুঁজতে এটি ব্যবহার করতে পারেন। আরেকটি উদাহরণ:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

এবং:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}

1

আমি বিশ্বাস করি যে কোনও সময় ইউনিট (মাস, দিন, ঘন্টা, মিনিট, সেকেন্ড, ...) বিয়োগ বা সংযোজন করার একটি পরিষ্কার এবং দুর্দান্ত উপায় জাভা.টাইম.আইন্সট্যান্ট ক্লাস ব্যবহার করে অর্জন করা যেতে পারে ।

বর্তমান সময় থেকে 5 দিন বিয়োগ এবং তারিখ হিসাবে ফলাফল পাওয়ার উদাহরণ:

new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());

1 ঘন্টা বিয়োগ করে 15 মিনিট যুক্ত করার জন্য আরেকটি উদাহরণ:

Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));

আপনার যদি আরও নির্ভুলতার প্রয়োজন হয় তবে ইনস্ট্যান্স ন্যানোসেকেন্ডগুলি পরিমাপ করে। ন্যানোসেকেন্ড অংশ পরিচালনা করার পদ্ধতি:

minusNano()
plusNano()
getNano()

এছাড়াও, মনে রাখবেন যে তারিখটি তাত্ক্ষণিকের মতো সঠিক নয়।


1
বা স্বাদের উপর নির্ভর করে কিছুটা খাটো:Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
ওলে ভিভি

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

0

এলি কোর্টরাইটের দ্বিতীয় সমাধানটি ভুল, এটি হওয়া উচিত:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());

2
এলির দ্রবণে ফাংশনের নাম addDays; তার সমাধানটি সঠিক। আপনি যদি তারিখ থেকে দিনগুলি বিয়োগ করতে চান তবে আপনি এর জন্য একটি নেতিবাচক মান দিয়ে গেছেন days
থমাস আপটন

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