如何编写一个程序来读取日期并计算到年底的剩余天数?

How to make a program that reads a date and calculate the number of days left until the end of year?

我有一个非常简单的问题,我不知道如何将用户的日期减去 01/01 /(用户年份)+1。我真的卡在这一点上了。

public static void main(String[] args)
{
    String date;
    Scanner teclado = new Scanner (System.in);
    System.out.println("Dame una fecha formato dd/mm/yyyy");
    date=teclado.next();
    Date mydate =FinalAnio.ParseFecha(date);    
    System.out.println(mydate);
    
    
}

 public static Date ParseFecha(String fecha)
    {
        SimpleDateFormat formato = new SimpleDateFormat("dd/mm/yyyy");
        Date fechaDate = null;
        try 
        {
            fechaDate = formato.parse(fecha);
        } 
        catch (ParseException ex) 
        {
            System.out.println(ex);
        }
        return fechaDate;
    }

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期工作。

    DateTimeFormatter formatador = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    String entradaUsuario = "02/12/2020";
    LocalDate fecha = LocalDate.parse(entradaUsuario, formatador);
    LocalDate finDeAño = fecha.with(MonthDay.of(Month.DECEMBER, 31));
    long diasRestantes = ChronoUnit.DAYS.between(fecha, finDeAño);
    System.out.println(diasRestantes);

输出为:

29

在格式模式字符串中,大写 MM 表示一年中的月份(小写 mm 表示小时中的分钟数,因此在这里没有用)。 uuuu 是年份(yyyy 也可以)。

fecha.with(MonthDay.of(Month.DECEMBER, 31))将日期调整为同年12月31日.

Link

Oracle tutorial: Date Time 解释如何使用 java.time.

  1. java.util 的日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API.

    • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time Java 6 和 7 的功能。
    • 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and
  2. 不要使用 mm 作为月份,因为它用于分钟。对于月份,正确的符号是 MM。检查 DateTimeFormatter 了解更多关于用于 parsing/formatting string/date-time.

    的各种符号
  3. Period and Duration tutorial from Oracle. It would also be worth going through this Wikipedia page on Durations.

    了解周期和持续时间的计算

演示:

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter date in the format dd/MM/yyyy: ");
        String strDate = scanner.next();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ENGLISH);
        LocalDate userDate = LocalDate.parse(strDate, dtf);

        // The date representing 01/01/(the user year)+1
        LocalDate targetDate = userDate.withDayOfMonth(1).withMonth(1).plusYears(1);

        System.out.println("User's date: " + strDate);
        System.out.println("Target date: " + targetDate.format(dtf));

        Period period = Period.between(userDate, targetDate);
        System.out.printf("Difference: %d days %d months %d years%n", period.getDays(), period.getMonths(),
                period.getYears());

        System.out.println("The difference in terms of days: " + ChronoUnit.DAYS.between(userDate, targetDate));
    }
}

样本运行:

Enter date in the format dd/MM/yyyy: 20/10/2015
User's date: 20/10/2015
Target date: 01/01/2016
Difference: 12 days 2 months 0 years
The difference in terms of days: 73

Trail: Date Time.

了解现代日期时间 API