รับจำนวนเดือนระหว่างวันที่และวันนี้ใน JAVA [ซ้ำกัน]

ฉันกำลังพยายามรับจำนวนเดือนระหว่างวันที่ที่กำหนดในรูปแบบ String (31-05-2562) ส่งเป็นพารามิเตอร์และวันนี้ : 2020-07-13 ในตัวอย่างนี้จะเป็น 13 เดือน

ฉันต้องการใส่คำตอบลงในตัวแปร int

มีวิธีง่าย ๆ ในการทำหรือไม่?

ขอบคุณมาก!


person Rebi Khalifa    schedule 14.07.2020    source แหล่งที่มา
comment
@Niroshan Date คลาสที่แย่มากทั้งคู่ถูกแทนที่เมื่อหลายปีก่อนโดยคลาส java.time สมัยใหม่เมื่อหลายปีก่อนด้วยการนำ JSR 310 มาใช้ การแนะนำการใช้งานในปี 2020 ถือเป็นคำแนะนำที่ไม่ดี   -  person Basil Bourque    schedule 14.07.2020
comment
ดูเหมือนว่าจะไม่มีการวิจัยอย่างดีใช่ไหม มีคำถามที่คล้ายกัน เช่น ความแตกต่างของเดือนของ Java Date คำตอบของ Kuchi นี้น่าจะมีประโยชน์   -  person Ole V.V.    schedule 14.07.2020


คำตอบ (3)


ตั้งแต่จาวา 1.8:

LocalDate today = LocalDate.now();
LocalDate myDate = LocalDate.parse("2019-05-31");
int months = (int) Period.between(myDate,today).toTotalMonths();
System.out.println(months); // output: 13
person Marc    schedule 14.07.2020
comment
ว้าว ขอบคุณมาก...ไม่รู้ว่ามันง่ายขนาดนี้ :D - person Rebi Khalifa; 14.07.2020
comment
แม้ว่าผลลัพธ์จะไม่เข้ากับ int ไม่น่าจะเป็นไปได้มากนัก แต่ฉันพบว่าวิธีที่ดีที่สุดคือตรวจสอบสมมติฐานว่าเป็นเช่นนั้น ใช้ Math.toIntExact(Period.between(myDate,today).toTotalMonths()) - person Ole V.V.; 14.07.2020

java.time

ใช้คลาส java.time

เมธอด Period::toTotalMonths ส่งคืน long สำหรับจำนวนเดือนที่ผ่านไปตลอดช่วงเวลา

คุณขอ int แทนที่จะเป็น long แทนที่จะโยน long ไปยัง int ที่คุณต้องการ ให้โทร Math.toIntExact วิธีนี้จะทำให้เกิดข้อยกเว้นหากผลลัพธ์ที่แคบลงจากการโอเวอร์โฟลว์แบบหล่อ

int months =
    Math.toIntExact(
        Period.between
        (
            LocalDate.parse( "2019-05-31" ) ,
            LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
        )
        .toTotalMonths()
    )
;
person Basil Bourque    schedule 14.07.2020

คุณสามารถใช้แนวทางต่อไปนี้

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class DateUtil{

    public static void main(String[] args) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String date = "2019-05-31";
        LocalDate localDate = LocalDate.parse(date, formatter);
        LocalDate now = LocalDate.now();

        long diff = ChronoUnit.MONTHS.between(localDate, now);

        System.out.println(diff);

    }
}

person Prashanth D    schedule 14.07.2020
comment
ไม่จำเป็นต้องกำหนดรูปแบบการจัดรูปแบบที่กำหนดเองสำหรับรูปแบบ ISO 8601 มาตรฐาน บิวท์อิน. - person Basil Bourque; 14.07.2020