سؤال

أحتاج إلى تحديد العام الحالي في Java كعدد صحيح.يمكنني فقط استخدام java.util.Date(), ، ولكن تم إهماله.

هل كانت مفيدة؟

المحلول

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

لست متأكدًا مما إذا كان هذا يفي بمعايير عدم إعداد تقويم جديد؟(لماذا المعارضة للقيام بذلك؟)

نصائح أخرى

باستخدام واجهة برمجة التطبيقات الزمنية الخاصة بـ Java 8 (بافتراض أنك سعيد بالحصول على السنة وفقًا للمنطقة الزمنية الافتراضية لنظامك)، يمكنك استخدام ال Year::now طريقة:

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

هذا أبسط (باستخدام التقويم، آسف) هو:

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

وهناك أيضا الجديد التاريخ والوقت API JSR, ، إلى جانب توقيت جودا

أسهل طريقة هي الحصول على السنة من التقويم.

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

إذا كنت تريد سنة أي كائن تاريخ، فقد استخدمت الطريقة التالية:

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;
}

يمكنك أيضًا استخدام طريقتين من java.time.YearMonth(منذ جافا 8):

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

ليرة تركية ؛ د

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

وحدة زمنية

الاجابة بواسطة رافي خاتشادوريان يظهر بحكمة كيفية استخدام الجديد حزمة جافا.تايم في جافا 8.لكن هذه الإجابة تفشل في معالجة المشكلة الحاسمة المتعلقة بالمنطقة الزمنية في تحديد التاريخ.

int year = LocalDate.now().getYear();

يعتمد هذا الرمز على المنطقة الزمنية الافتراضية الحالية لـ JVM.يتم استخدام المنطقة الافتراضية في تحديد تاريخ اليوم.تذكر، على سبيل المثال، أنه في اللحظة التي تلي منتصف الليل في باريس، يظل التاريخ في مونتريال "أمس".

لذلك قد تختلف نتائجك حسب الجهاز الذي يتم تشغيله عليه، أو تغيير المستخدم/المسؤول للمنطقة الزمنية لنظام التشغيل المضيف، أو أي رمز Java في أي لحظة تغيير الإعداد الافتراضي الحالي لـ JVM.من الأفضل تحديد المنطقة الزمنية.

بالمناسبة، استخدم دائما أسماء المناطق الزمنية المناسبة مثل المحددة من قبل IANA.لا تستخدم أبدًا الرموز المكونة من 3-4 أحرف والتي ليست موحدة أو فريدة من نوعها.

java.time

مثال في java.time لـ Java 8.

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

جودا تايم

بعض الأفكار على النحو الوارد أعلاه، ولكن باستخدام جودا تايم 2.7 المكتبة.

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

سنة متزايدة/متناقصة

إذا كان هدفك هو القفز سنة تلو الأخرى، فلا داعي لاستخراج رقم السنة.لدى كل من Joda-Time وjava.time طرق لإضافة/طرح سنة في المرة.وهذه الأساليب ذكية في التعامل مع التوقيت الصيفي وغيره من الحالات الشاذة.

مثال في Joda-Time 2.7.

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

إذا كان تطبيقك يستخدم بشكل مكثف كائنات التاريخ والتقويم، فيجب عليك حقًا استخدام Joda Time، لأنه java.util.Date قابل للتغيير. java.util.Calendar يواجه مشاكل في الأداء عندما يتم تحديث حقوله، كما أنه غير متقن بالنسبة لحسابات التاريخ والوقت.

يمكنك أيضًا استخدام Java 8 LocalDate:

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();

كما أجاب بعض الناس أعلاه:

إذا كنت تريد استخدام المتغير لاحقًا، فمن الأفضل استخدام:

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));
}

يمكنك القيام بالأمر برمته باستخدام الرياضيات الصحيحة دون الحاجة إلى إنشاء تقويم:

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

قد أكون خارجًا لمدة ساعة أو ساعتين في العام الجديد ولكن لا يوجد لدي انطباع بأن هذه مشكلة؟

أستخدم وظائف خاصة في مكتبتي للعمل مع أرقام الأيام/الشهر/السنة -

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 ) { 
 ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top