জাভাতে চলতি বছরের পূর্ণসংখ্যার মানটি পান


300

আমার জাভাতে চলতি বছরটি একটি পূর্ণসংখ্যা হিসাবে নির্ধারণ করতে হবে। আমি কেবল ব্যবহার করতে পারি java.util.Date(), তবে এটি অবহেলা করা হয়েছে।


3
না, অবচয় করা java.util.Dateহয় না , জাভা ৮-এর মতো নয় Some এর কয়েকটি পদ্ধতি হ্রাস করা হয়েছে তবে পুরো শ্রেণি নয়। তবে আপনার উভয়কে এড়ানো উচিত java.util.Dateএবং java.util.Calendarকারণ এগুলি কুখ্যাত সমস্যা, বিভ্রান্তিকর এবং ত্রুটিযুক্ত। পরিবর্তে হয় জাভা.টাইম (জাভা 8 এ) বা জোদা-সময় ব্যবহার করুন
তুলসী বাউরক

উত্তর:


636
int year = Calendar.getInstance().get(Calendar.YEAR);

নিশ্চিত না যে এটি একটি নতুন ক্যালেন্ডার স্থাপন না করার মানদণ্ডের সাথে মিলিত হয়েছে? (বিরোধী দল কেন এমন করছে?)


1
আপনার উত্তরটি দেখার পরে, ক্যালেন্ডারটি ব্যবহার করার জন্য একটি সূক্ষ্ম বস্তু হবে। আমি একটি ওয়ানলাইনারের সন্ধান করছিলাম এবং আমার মনে হয়নি ক্যালেন্ডারটি আমার কাছে থাকবে। ভুল প্রমাণিত আমি! ধন্যবাদ!
karlgrz

সমঝোতার কী হবে, অন্য থ্রেড / লাইব্রেরি কোডের টুকরো যদি বর্তমান সময়ের পরিবর্তন হয়? এটিকে এমন কিছুতে সংশোধন করা যুক্তিসঙ্গত হবে না: ক্যালেন্ডার সি = ক্যালেন্ডার.সেট ইনসটেন্স (); সিঙ্ক্রোনাইজড (সি) {সি.সেটটাইমআইনমিলিস (সিস্টেম.কন্ট্রেন্টটাইমমিলিস ()); রিটার্ন c.get (Calendar.YEAR);}
জুনিয়র

1
এটি অ্যান্ড্রয়েডের বিভিন্ন সংস্করণে আলাদা মান দেয়। আমি v4.2.1 এর সাথে অ্যান্ড্রয়েড v4.1.2 তুলনা করছি।
toobsco42

2
@ আইএননিক্স কোডটি নিয়ে কোনও সহীকরণের সমস্যা নেই, সুতরাং এটি আরও সংকলিত করার দরকার নেই। Calendar.getInstance().get(Calendar.YEAR) ঘড়িটি বাহ্যিকভাবে পরিবর্তিত হওয়ার ক্ষেত্রে পারমাণবিক এবং synchronized(c)স্থানীয় ভেরিয়েবলের নতুন উদাহরণটি করা এখানে কোনওভাবেই অর্থহীন হতে পারে।
টি


139

জাভা 8 এর টাইম এপিআই ব্যবহার করে (ধরে নিচ্ছেন যে আপনি আপনার সিস্টেমে ডিফল্ট টাইম জোনে বছরটি পেয়ে আনন্দিত), আপনি এই Year::nowপদ্ধতিটি ব্যবহার করতে পারেন :

int year = Year.now().getValue();

7
আমি সবসময় Vচ্ছিক ZoneIdযুক্তিটি nowJVM- র বর্তমান ডিফল্ট জোনে (যা রানটাইমের সময় যে কোনও মুহুর্তে পরিবর্তিত হতে পারে!) উপর সম্পূর্ণরূপে নির্ভর করার পরিবর্তে to চ্ছিক যুক্তিটি পাস করার পরামর্শ দিচ্ছি ।
বাসিল বাউরক

যা দেখতে এই int year = Year.now(ZoneId.of("America/New_York")).getValue(); বিটিডাব্লু
জাভাসে

25

এই সরলতম (ক্যালেন্ডার ব্যবহার করে, দুঃখিত) হ'ল:

 int year = Calendar.getInstance().get(Calendar.YEAR);

এছাড়াও রয়েছে নতুন তারিখ এবং সময় এপিআই জেএসআর , পাশাপাশি জোদা টাইম


এটি অ্যান্ড্রয়েডের বিভিন্ন সংস্করণে আলাদা মান দেয়। আমি v4.2.1 এর সাথে অ্যান্ড্রয়েড v4.1.2 তুলনা করছি।
toobsco42

1
@ টোবস্কো 42 - 'অ্যান্ড্রয়েড ক্যালেন্ডার.ইয়ার বাগ'
টুলকিট

আরে @ টোলকিট, আমি কোনও ভাগ্য ছাড়াই কিছু গবেষণা করে চলেছি। আমি আরও নির্দিষ্ট উত্তর আশা করছি।
toobsco42

আমি ফোন থেকে 4.1.2 দিয়ে আমার সিম কার্ডটি সরিয়েছি। সুতরাং নেটওয়ার্কটি ফোনে তারিখ এবং সময় আপডেট করতে সক্ষম হয়নি। ফলস্বরূপ ফোনটি ২০১২ সালে আটকে গিয়েছিল L.১.২ এ দেখে মনে হচ্ছে এটি কোনও বাগ নয়।
toobsco42

14

সবচেয়ে সহজ উপায় হল বছরটি ক্যালেন্ডার থেকে পাওয়া।

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);

ক্যালেন্ডার। YEAR বর্তমান বছর নয়।
টুলকিট

ক্যালেন্ডার.ইয়ারটি এভাবে সংজ্ঞায়িত করা হয় ... সর্বজনীন চূড়ান্ত স্থিতিশীল ইয়ার ইয়ার = 1;
ক্যাগকোবয়

2
ক্যালেন্ডারে get () এপিআই ধ্রুবক দ্বারা নির্দিষ্ট ক্ষেত্রের মধ্যে ড্যাটাম পায়। বছরটি 1 এর মাঠে ক্যালেন্ডার অবজেক্টে অবস্থিত! ক্যালেন্ডার.জেটআইনস্ট্যান্স () বর্তমান তারিখটি পাচ্ছে। java.sun.com/j2se/1.4.2/docs/api/java/util/…
বব কিং

এটি অ্যান্ড্রয়েডের বিভিন্ন সংস্করণে আলাদা মান দেয়। আমি v4.2.1 এর সাথে অ্যান্ড্রয়েড v4.1.2 তুলনা করছি।
toobsco42

আমি ফোন থেকে 4.1.2 দিয়ে আমার সিম কার্ডটি সরিয়েছি। সুতরাং নেটওয়ার্কটি ফোনে তারিখ এবং সময় আপডেট করতে সক্ষম হয়নি। ফলস্বরূপ ফোনটি ২০১২ সালে আটকে গিয়েছিল L.১.২ এ দেখে মনে হচ্ছে এটি কোনও বাগ নয়।
toobsco42

13

আপনি java.time.YearMonth(জাভা 8) থেকে 2 টি পদ্ধতিও ব্যবহার করতে পারেন :

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();

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

অনেক অনেক ধন্যবাদ। আমি সম্পাদনা করেছি। লিঙ্কটি আমার পথের থেকে কিছুটা আলাদা
ঝুরভ কনস্ট্যান্টিন

10

আপনি যদি কোনও তারিখের অবজেক্টের বছর চান তবে আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করেছি:

public static int getYearFromDate(Date date) {
    int result = -1;
    if (date != null) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        result = cal.get(Calendar.YEAR);
    }
    return result;
}

1970 এর ফলাফল!
ডাঃ এএনড্রো

10

TL; ড

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

সময় অঞ্চল

উত্তর দ্বারা Raffi Khatchadourian বিজ্ঞতার সঙ্গে শো নতুন কীভাবে ব্যবহার করবেন তা java.time প্যাকেজ জাভা 8. কিন্তু উত্তর যে একটি তারিখ নির্ধারণে সময় জোন জটিল সমস্যা মোকাবেলার ব্যর্থ।

int বছর = লোকালডেট.নো ()। getYear ();

এই কোডটি জেভিএমের বর্তমান ডিফল্ট টাইম জোনের উপর নির্ভর করে। ডিফল্ট অঞ্চলটি আজকের তারিখটি নির্ধারণে ব্যবহৃত হয়। উদাহরণস্বরূপ, মনে রাখবেন যে প্যারিসের মধ্যরাতের পরে মুহুর্তে মন্ট্রিয়ালে তারিখটি এখনও 'গতকাল'।

সুতরাং আপনার ফলাফলগুলি কোন মেশিনটিতে চালিত হয়, কোনও ব্যবহারকারী / অ্যাডমিন হোস্ট ওএস টাইম অঞ্চল পরিবর্তন করে, বা যে কোনও মুহুর্তে জাভা কোডটি জেভিএমের বর্তমান ডিফল্ট পরিবর্তন করে পরিবর্তিত হতে পারে। সময় অঞ্চল নির্দিষ্ট করা ভাল।

উপায় দ্বারা, সবসময় ব্যবহার সঠিক সময় অঞ্চল নাম হিসাবে IANA দ্বারা সংজ্ঞায়িত । কখনও কখনও 3-4 বর্ণচিহ্নগুলি ব্যবহার করবেন না যা মানক বা অনন্য নয়।

java.time

জাভা 8 এর জাভা.টাইমে উদাহরণ।

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

Joda-টাইম

উপরের মতো কিছু ধারণা, তবে জোদা-সময় ২.7 গ্রন্থাগারটি ব্যবহার করা হচ্ছে ।

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

বর্ধমান / হ্রাস বছর

যদি আপনার লক্ষ্যটি একবারে এক বছরে লাফিয়ে যায় তবে বছরের সংখ্যাটি বের করার দরকার নেই। জোদা-সময় এবং জাভা.টাইম উভয়েরই এক সাথে এক বছরে যোগ / বিয়োগের পদ্ধতি রয়েছে। এবং এই পদ্ধতিগুলি স্মার্ট, দিবালোক সংরক্ষণের সময় এবং অন্যান্য অসঙ্গতিগুলি পরিচালনা করে।

জোদা-সময় 2.7 উদাহরণ।

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
অলসদের জন্য সমস্ত জোন আইডি (আমি হিসাবে): এমকিওং
এফবিবি

1
@ এফবিবি আমি টাইম জোনের নামগুলির আনুষ্ঠানিক আইএএনএ তালিকার জন্য উইকিপিডিয়া পৃষ্ঠাটি প্রস্তাব করি । সাবধান: এই অঞ্চলগুলি প্রায়শই অবাক হয়। আপনি যদি সত্যই আপ-টু-ডেট তথ্য চান তবে tzdataডেটা ফাইলের একটি নতুন কপি নিজেই ডাউনলোড করুন। আপনি ফাইলটি অনুধাবন করতে পারেন। এবং আপনি আপনার জাভা প্রয়োগে একটি পুরানো tzdata প্রতিস্থাপন করতে পারেন। ওরাকল তাদের জেভিএমের জন্য একটি আপডেটের সরঞ্জাম সরবরাহ করে।
বাসিল বাউরক

4

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



3

কিছু লোক উপরে উত্তর হিসাবে:

আপনি যদি ভেরিয়েবলটি পরে ব্যবহার করতে চান তবে আরও ভাল ব্যবহার করুন:

int year;

year = Calendar.getInstance().get(Calendar.YEAR);

আপনার যদি কেবলমাত্র একটি শর্তের জন্য বছরের প্রয়োজন তবে আপনি আরও ভাল ব্যবহার করুন:

Calendar.getInstance().get(Calendar.YEAR)

উদাহরণস্বরূপ এটি একটি করণীয় ব্যবহারের সময় ব্যবহার করা হয়েছে যে প্রবর্তন করা চেকগুলি বর্তমান বছর -200 বা বর্তমান বছরের তুলনায় কম নয় (জন্মের বছর হতে পারে):

import java.util.Calendar;
import java.util.Scanner;

public static void main (String[] args){

    Scanner scannernumber = new Scanner(System.in);
    int year;

    /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/

    do{
        System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
        year = scannernumber.nextInt();
    }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR));
}

3

জাভা 8 এর জন্য নিম্নলিখিত কোডটি ব্যবহার করুন:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();

0

আমার ক্ষেত্রে উপরের কোনওটিই কাজ করে না। সুতরাং অনেকগুলি সমাধানের চেষ্টা করার পরে আমি একটির নীচে পেয়েছি এবং এটি আমার জন্য কাজ করেছে

import java.util.Scanner;
import java.util.Date;

public class Practice
{   
    public static void main(String[] args)
    {
        Date d=new Date();  
        int year=d.getYear();
        int currentYear=year+1900;    

        System.out.println(currentYear);

    }

}

এই পদ্ধতিটি হ্রাস করা হয়। এবং সেই ভয়ানক শ্রেণিটি JSR 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাসগুলি দ্বারা বহু বছর পূর্বে দমন করা হয়েছিল ass অশ্লীল উত্তর দ্বারা আধুনিক সমাধান দেখুন ।
তুলসী বার্ক

-1

জাভা সংস্করণে 8+ জাভা.টাইম লাইব্রেরি ব্যবহার করতে (পরামর্শ দেওয়া) করতে পারেআইএসও 8601 তারিখগুলি লেখার মানক উপায় সেট করে: YYYY-MM-DDএবং java.time.Instantএটি ব্যবহার করে, সুতরাং (এর জন্য UTC):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

দ্রষ্টব্য ধরো যদি (এবং পাবার জন্য shorted মধ্যে Stringনা int), ব্যবহার Calendarসৌন্দর্য ভাল এবং জোন-সচেতন করা যেতে পারে।


আপনি সময় অঞ্চলটির গুরুত্বপূর্ণ সমস্যাটিকে উপেক্ষা করছেন। অন্যান্য উত্তরের সহজ সমাধান দেখুন ।
তুলসী বার্ক

-2

আপনি কোনও ক্যালেন্ডার ইনস্ট্যান্ট করার দরকার ছাড়াই পূর্ণসংখ্যার গণিত ব্যবহার করে পুরো কাজটি করতে পারেন:

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

নতুন বছরে এক ঘন্টা বা দু'বারের জন্য বন্ধ থাকতে পারে তবে আমি কী ইস্যুটি মনে করি না?


9
আপনি সম্ভবত আপেলের জন্য কাজ করছেন? macworld.com/article/2023580/…
স্টিফান পল নোক

বাহ, এটি খুব ভারী, আমি এটি সহজ রাখার পরামর্শ দেব যেমন ক্যাগকোবয় দেখিয়েছে।
এল স্ট্রাইক

এটি সমস্ত পরিস্থিতিতে সেরা নাও হতে পারে তবে এটি নিম্নাঞ্চলের প্রাপ্য নয়।
জনিলম্বদা

-4

দিন / মাস / বছরের ইনট নিয়ে কাজ করার জন্য আমি আমার লাইব্রেরিতে বিশেষ ফাংশন ব্যবহার করি -

int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
  Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
  return new int[] { 
    cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
  };
};


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