জাভা: তারিখ থেকে মাস পূর্ণসংখ্যা পান


157

তারিখ অবজেক্ট ( java.util.Date) থেকে পূর্ণসংখ্যা হিসাবে আমি কীভাবে মাস পাব ?


23
প্রকৃতপক্ষে getMonth () তারিখে চিরকালের জন্য অবচয় করা হয়েছে;)
ম্যাটিউজ ডিমসিজিক

6
@ এসএলএইচইচকি: অবমূল্যায়িত। জেডিকে সংস্করণ ১.১ অনুসারে, ক্যালেন্ডার.জেট (ক্যালেন্ডার.মোনথ) দ্বারা প্রতিস্থাপিত হয়েছে।
আদর্শ

3
@ জেনজেন আমি বেশিরভাগ অবহেলিত শ্রেণিতে অবহেলিত পদ্ধতি ব্যবহার করতে সমস্যা দেখতে পাচ্ছি না।
সেরাবে

1
@ মুহদ আপনি যদি খেজুর নিয়ে কাজ করে থাকেন তবে নিজেকে সহায়তা করুন এবং জোদা বা অন্য কোনও লাইব্রেরি ব্যবহার করুন।
সেরাবে

1
@ সেরাবে: সমস্যাটি হ'ল আরও ভাল সমাধান রয়েছে (যেগুলি অন্তত অবহেলিত নয়)। এবং getMonth এখন 14 বছরের মতো অবনমিত হয়েছে এবং এটি একটি কারণের জন্য অবচিত করা হয়েছে।
ম্যাটিউজ ডিমসিজিক

উত্তর:


57

জাভা.টাইম (জাভা 8)

আপনি জাভা 8-তে জাভা.টাইম প্যাকেজটি ব্যবহার করতে পারেন এবং আপনার java.util.Dateঅবজেক্টটিকে কোনও java.time.LocalDateঅবজেক্টে রূপান্তর করতে পারেন এবং তারপরে কেবল getMonthValue()পদ্ধতিটি ব্যবহার করতে পারেন ।

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();

নোট করুন যে মাসের মানগুলি এখানে cal.get(Calendar.MONTH)আদর্শের উত্তরের বিপরীতে 1 থেকে 12 পর্যন্ত দেওয়া হয় যা 0 থেকে 11 পর্যন্ত মান দেয়।

তবে বাসিল বাউর্ক মন্তব্যে যেমন বলেছিলেন, পছন্দের Monthউপায়টি হল LocalDate::getMonthপদ্ধতিটির সাথে এনাম অবজেক্ট পাওয়া ।


1
ভাল উত্তর. পাঠকের জন্য নোট: আপনি উত্তরটিতে প্রদর্শিত ডিফল্ট কলের উপর নির্ভর না করে সময় অঞ্চল নির্দিষ্ট করতে চাইতে পারেন। একটি নতুন দিন (এবং মাস) প্যারিসে উদাহরণস্বরূপ, মন্ট্রিয়ালের চেয়ে শুরুর দিকে। আপনি যদি মন্ট্রিয়াল, ব্যবহার সম্পর্কে বিশেষত যত্নশীল হন ZoneId.of( "America/Montreal" )
তুলসী বাউরক

1
আমি কেবল যুক্ত করতে চাই যে জাভা.টাইম এপিআই এরাকল ডটকম

যাইহোক, পাঠকের জন্য আরও একটি নোট: আপনি কেবল একটি পূর্ণসংখ্যার সংখ্যা না দিয়ে Monthএনাম অবজেক্টটিও পেতে পারেন । পদ্ধতি Month m = localDate.gotMonth();দেখুন LocalDate::getMonth। এর মতো অবজেক্ট ব্যবহার করা আপনার কোডটিকে স্ব-ডকুমেন্টিং করে, প্রকারের সুরক্ষা নিশ্চিত করে এবং বৈধ মানগুলির গ্যারান্টি দেয়। ওরাকল-এর এনাম টিউটোরিয়াল দেখুন ।
বাসিল বাউর্কে

1
যদি আপনি ব্যবহার করেন date.toInstant()এবং আপনি কোনও java.sql.Date(সন্তানের java.util.Date) সাথে কাজ করছেন তবে আপনি একটি পাবেন UnsupportedOperationException। চেষ্টা করুনnew java.sql.Date(src.getTime()).toLocalDate()
আদম 14

1
@ অ্যাডাম java.sql.Dateসেই পুরানো শ্রেণিতে যুক্ত হওয়া নতুন রূপান্তর পদ্ধতি ব্যবহার করে / থেকে রূপান্তর করা অনেক সহজ । java.sql.Date.valueOf( myLocalDate )এবং myJavaSqlDate.toLocalDate() এছাড়াও, জেডিবিসি ড্রাইভারদের জেডিবিসি ৪.২ এর জন্য আপডেট করা হয়েছে বা তার পরে আর java.sqlপ্রকারের প্রয়োজন নেই , এবং সরাসরি এবং পদ্ধতিগুলির java.timeমাধ্যমে প্রকারগুলি সম্বোধন করতে পারে। ResultSet::getObjectPreparedStatement::setObject
বেসিল Bourque

287
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);

166
নোট করুন যে Calendar.MONTHকোনও আপাত কারণে জেরো ভিত্তিক নয়, অর্থাৎ জানুয়ারী == 0। এখন এপিআই-তে ঠিক এটি নথিভুক্ত করা হয়েছে, তবে এটি এখনও প্রথমবারের ব্যবহারকারীদের জন্য নরক হিসাবে বিভ্রান্তিকর। আমি এখনও এমন কাউকে খুঁজে পেয়েছি যাঁরা আমাকে কেন বলতে পারলেন যে তারা কেন সে সাথে চলেছিল - সম্ভবত একটি নতুন এসও প্রশ্নের নিজের জন্য সময় আসতে পারে (যদিও আমি আশঙ্কা করি যে এর কোনও দুর্দান্ত পটভূমি নেই: /)
ভু

5
@ ভু ডেট.জেটমনেথ () পদ্ধতিটি শূন্য ভিত্তিক ছিল, এটিই সম্ভবত মুখ্য কারণ ক্যালেন্ডার M সোমথও।
মুহিত

1
@ মুঃহুর শুরুর পরেও এটি প্রতিস্থাপন ছিল। তবে কেবল ডেট.গেটমনেথ () শূন্যের ভিত্তিতে কেন এই প্রশ্নটি পরিবর্তিত হয়েছিল? ইমো একটি ভয়ঙ্কর নকশা, বিশেষত যেহেতু দিনগুলি এক থেকে শুরু হয় (তারা কমপক্ষে সামঞ্জস্যপূর্ণ হতে পারে!)। আমি ধরে নিই যে এটি একটি বিশেষভাবে সুনির্দিষ্টভাবে ডিজাইন করা API (তারিখ এবং ক্যালেন্ডার উভয়) দিয়ে কিছুটা পর্যবেক্ষণ ছিল। তবে এর কিছু নজির আছে - এটি আমার কাছে কেবল অদ্ভুত বলে মনে হয় এবং এটি আমার অভিজ্ঞতাকে একাধিক শিক্ষানবিশকে সমস্যা সৃষ্টি করে।
ভু

2
আসলে এটি ইতিমধ্যে এখানে এসও জিজ্ঞাসা করা হয়েছে (এবং না শুধুমাত্র)। নীচের লাইনটি টিএনএটি এটি খারাপভাবে ডিজাইন করা এপিআইয়ের ফলাফল। আমি বোঝাতে চাইছি আপনি পুরো ডেট ক্লাসটি একটি রসিকতা। মজার ঘটনাটি হ'ল জাভা কেবল এই সমস্যায় ভোগেন না - জাভা স্ক্রিপ্টের ডেট গেটমোনথ () এছাড়াও 0 দিয়ে শুরু হয়!
ম্যাটিউজ ডিমসিজিক

1
@ ভুও getYear()হ'ল, "কোন আপাত কারণে" 1900 দ্বারা বিয়োগ করা হয়েছে
হেল

17

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

LocalDate today = LocalDate.now();
int month = today.getMonthValue();

7

Joda-টাইম

বিকল্পভাবে, জোদা-টাইম DateTime শ্রেণীর সাথে।

//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))

... অথবা ...

int month = dateTime.getMonthOfYear();

2
এমনকি সহজ, কেবল DateTimeতার মাসের জন্য অবজেক্টটি জিজ্ঞাসা করুন । int month = dateTime.getMonthOfYear();
তুলসী বাউরক

ভাল কল কলসি, আমি কোড আপডেট করেছি। তবে আমি এটি পছন্দ করি .toString("MM")কেবল "এমএম" এর চেয়ে আরও বেশি সম্ভাবনা রয়েছে।
সোসওয়ার্ড

1
এই উত্তরটি সময় অঞ্চলটির গুরুত্বপূর্ণ সমস্যাটিকে উপেক্ষা করে। প্রশ্ন এবং ভাইবোন উত্তর সম্পর্কে আমার মন্তব্য দেখুন। আমি একটি ক্ষণস্থায়ী করার পরামর্শ দিই DateTimeZoneযে তারিখসময় কন্সট্রাকটর করার বস্তু: DateTimeZone.forID( "America/Montreal" )
তুলসী বাউরক

6

TL; ড

myUtilDate.toInstant()                          // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
          .atZone(                              // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object. 
              ZoneId.of( "America/Montreal" )   // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
          )                                     // Returns a `ZonedDateTime` object.
          .getMonthValue()                      // Extract a month number. Returns a `int` number.

java.time বিস্তারিত

উত্তর ব্যবহারের জন্য Ortomala Lokni দ্বারা java.time সঠিক। এবং আপনার জাভা.টাইম ব্যবহার করা উচিত কারণ এটি পুরানো java.util.Date/.C ক্যালেন্ডার ক্লাসগুলির তুলনায় একটি বিশাল উন্নতি। জাভা.টাইমে ওরাকল টিউটোরিয়ালটি দেখুন ।

Java.util.Date বিবেচনা না করে কিভাবে জাভা.টাইম ব্যবহার করবেন তা দেখানোর জন্য আমি কয়েকটি কোড যুক্ত করব, যখন আপনি নতুন কোড দিয়ে শুরু করছেন।

সংক্ষেপে জাভা.টাইম ব্যবহার করা… Instantইউটিসিতে সময়রেখার একটি মুহুর্ত। একটি সময় অঞ্চল প্রয়োগ করুন ( ZoneId)ZonedDateTime

Monthবর্গ একটি পরিশীলিত হয় enum সাধারণভাবে এক মাসে প্রতিনিধিত্ব করতে। সেই এনামের স্থানীয় নামকরণের মতো সহজ পদ্ধতি রয়েছে। এবং নিশ্চিন্ত থাকুন যে জাভা.টাইমে মাসের নম্বরটি একটি বুদ্ধিমান, 1-12 নয়, শূন্য-ভিত্তিক বাজে কথা (0-11) জাভা.ইটি.এল.ডেট /.ক্যালেন্ডারে পাওয়া যায় না।

বর্তমান তারিখ-সময় পেতে সময় অঞ্চল গুরুত্বপূর্ণ ial কোনও মুহুর্তে বিশ্বব্যাপী তারিখটি এক রকম হয় না । সুতরাং মাসটি বিশ্বব্যাপী সমান হয় না যদি মাসের সমাপ্তি / শুরুর কাছাকাছি থাকে।

ZoneId zoneId = ZoneId.of( "America/Montreal" );  // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth(); 
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );

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

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই শ্রেণীর বিরক্তিজনক পুরাতন স্থানচ্যুত উত্তরাধিকার যেমন তারিখ-সময় শ্রেণীর java.util.Date, Calendar, &SimpleDateFormat

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

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

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

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

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


4

যদি আপনি জোদা সময় ব্যবহার করতে না পারেন এবং আপনি এখনও অন্ধকার বিশ্বে বাস করেন :) (জাভা 5 বা নিম্ন) আপনি এটি উপভোগ করতে পারেন:

দ্রষ্টব্য: আপনার তারিখটি বিন্যাসের দ্বারা তৈরি করা সমস্ত প্রস্তুত: ডিডি / এমএম / ওয়াইওয়াই ওয়াই নিশ্চিত করুন

/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
    return Integer.parseInt(dateFormat.format(date));
}

/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
    return Integer.parseInt(dateFormat.format(date));
}

তুমি মা! / Είσαι η μάνα!
তেজেনোস

0
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1

প্রত্যাবর্তিত মান 0 থেকে শুরু হয়, সুতরাং আপনার ফলাফলের সাথে একটি যুক্ত করা উচিত।


6
আপনার উত্তর নিয়ে 2 টি সমস্যা: একটি হ'ল আপনি বর্তমান সময় new Date()ছাড়া তারিখ তৈরি করতে পারেন System.currentTimeMillis। অন্যটি হ'ল getMonth অবমূল্যায়িত।
মুহাদ

@ মুহদ তাহলে সর্বোত্তম সমাধান কি?
twlkyao

@ মুহদ দ্য সিস্টেম। কর্নারটাইমমিলিস () আমি এখানে যুক্ত করলাম এটি এখানে একটি দীর্ঘ প্রকারের নির্দেশ করে এবং আপনি তারিখটি নির্দিষ্ট করতে পারেন।
twlkyao

4
তারিখ :: getMonth ইতোমধ্যে জাভা ১.১ এ অবমুক্ত করা হয়েছিল ( cs.mun.ca/~michael/java/jdk1.1-beta2-docs/api/… )
অরটোমালা লোকনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.