ฉันต้องกำหนดปีปัจจุบันใน Java เป็นจำนวนเต็ม ฉันสามารถใช้java.util.Date()
แต่ก็เลิกใช้แล้ว
ฉันต้องกำหนดปีปัจจุบันใน Java เป็นจำนวนเต็ม ฉันสามารถใช้java.util.Date()
แต่ก็เลิกใช้แล้ว
คำตอบ:
int year = Calendar.getInstance().get(Calendar.YEAR);
ไม่แน่ใจว่าตรงตามเกณฑ์ของการไม่ตั้งค่าปฏิทินใหม่หรือไม่? (ทำไมฝ่ายค้านถึงทำเช่นนั้น?)
Calendar.getInstance().get(Calendar.YEAR)
เป็นอะตอมเกี่ยวกับนาฬิกาที่มีการเปลี่ยนแปลงจากภายนอกและการทำsynchronized(c)
กับอินสแตนซ์ใหม่ของตัวแปรท้องถิ่นจะไม่มีจุดหมายใด ๆ ที่นี่
import java.util.Calendar
โดยใช้เวลาใน Java API 8 (สมมติว่าคุณมีความสุขที่จะได้รับในปีโซนเวลาเริ่มต้นของระบบของคุณ) คุณสามารถใช้วิธีการ :Year::now
int year = Year.now().getValue();
ZoneId
อาร์กิวเมนต์ที่เป็นตัวเลือกไปยังnow
แทนที่จะพึ่งพาปริยายในโซนเริ่มต้นปัจจุบันของ JVM (ซึ่งสามารถเปลี่ยนแปลงได้ตลอดเวลาระหว่างรันไทม์!)
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
ง่ายที่สุด (ใช้ปฏิทินขออภัย) คือ:
int year = Calendar.getInstance().get(Calendar.YEAR);
นอกจากนี้ยังมีใหม่วันที่และเวลา API JSRเช่นเดียวกับJoda เวลา
วิธีที่ง่ายที่สุดคือการรับปีจากปฏิทิน
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
คุณสามารถใช้ 2 วิธีจากjava.time.YearMonth
(ตั้งแต่ Java 8):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
หากคุณต้องการปีของวัตถุวันที่ใด ๆ ฉันใช้วิธีต่อไปนี้:
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;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
คำตอบโดยRaffi Khatchadourianแสดงวิธีใช้แพ็คเกจ java.timeใหม่ใน Java 8 อย่างชาญฉลาดแต่คำตอบนั้นล้มเหลวในการแก้ไขปัญหาสำคัญของเขตเวลาในการกำหนดวันที่
int year = LocalDate.now (). getYear ();
รหัสนั้นขึ้นอยู่กับเขตเวลาเริ่มต้นปัจจุบันของ JVM โซนเริ่มต้นใช้ในการกำหนดวันที่วันนี้ ตัวอย่างเช่นจำไว้ว่าในช่วงเวลาหลังเที่ยงคืนในปารีสวันที่ในมอนทรีออลยังคงเป็น 'เมื่อวาน'
ดังนั้นผลลัพธ์ของคุณอาจแตกต่างกันไปโดยสิ่งที่เครื่องจะทำงานบนผู้ใช้ / การเปลี่ยนโซนเวลาโฮสต์ OS หรือรหัส Java ใด ๆ ผู้ดูแลระบบในช่วงเวลาใดการเปลี่ยนแปลงเริ่มต้นปัจจุบัน JVM ของ ดีกว่าที่จะระบุเขตเวลา
อย่างไรก็ตามใช้ชื่อเขตเวลาที่เหมาะสมตามที่กำหนดโดย IANAเสมอ อย่าใช้รหัสตัวอักษร 3-4 ตัวที่ไม่ได้มาตรฐานหรือไม่ซ้ำ
ตัวอย่างใน java.time ของ Java 8
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
แนวคิดบางอย่างข้างต้น แต่ใช้ห้องสมุดJoda-Time 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 ) ;
tzdata
หากแอปพลิเคชันของคุณใช้วัตถุ Date และ Calendar อย่างหนักคุณควรใช้ Joda Time เพราะjava.util.Date
ไม่สามารถเปลี่ยนแปลงได้ java.util.Calendar
มีปัญหาประสิทธิภาพเมื่อเขตข้อมูลได้รับการปรับปรุงและ clunky สำหรับเลขคณิตของวันที่
คุณยังสามารถใช้ Java 8's 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));
}
ใช้รหัสต่อไปนี้สำหรับ java 8:
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
ในกรณีของฉันไม่มีการทำงานใด ๆ ข้างต้น ดังนั้นหลังจากลองใช้วิธีแก้ปัญหามากมายฉันพบว่ามันใช้งานได้
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);
}
}
ใน Java เวอร์ชัน 8+ สามารถ (แนะนำให้ใช้) ใช้ไลบรารีjava.time ISO 8601กำหนดวิธีมาตรฐานในการเขียนวันที่: YYYY-MM-DD
และjava.time.Instant
ใช้ดังนั้น (สำหรับUTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS ในกรณี (และย่อมาจากการรับString
ไม่ใช่int
) การใช้งานCalendar
ดูดีขึ้นและสามารถทำให้โซนรับรู้ได้
คุณสามารถทำสิ่งทั้งหมดโดยใช้เลขจำนวนเต็มโดยไม่ต้องสร้างอินสแตนซ์ของปฏิทิน:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
อาจปิดปีหรือสองชั่วโมงในปีใหม่ แต่ฉันไม่ได้รับความประทับใจที่เป็นปัญหาหรือไม่
ฉันใช้ฟังก์ชั่นพิเศษในห้องสมุดของฉันเพื่อทำงานกับ ints วัน / เดือน / ปี -
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 ) {
...
}
java.util.Date
เป็นไม่เลิกไม่เป็นชวา 8. บางส่วนของวิธีการจะเลิก แต่ไม่ทั้งชั้น แต่คุณควรหลีกเลี่ยงทั้งคู่java.util.Date
และjava.util.Calendar
ในขณะที่พวกเขากำลังลำบากสับสนและมีข้อบกพร่อง ใช้java.time (ใน Java 8) หรือJoda-Timeแทน