Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用Java.time将object.toString解析为LocalDate时遇到问题_Java_Datetime_Datetime Format_Java Time - Fatal编程技术网

Java:使用Java.time将object.toString解析为LocalDate时遇到问题

Java:使用Java.time将object.toString解析为LocalDate时遇到问题,java,datetime,datetime-format,java-time,Java,Datetime,Datetime Format,Java Time,我正在处理一个问题集,并试图构建一个返回日期的类。对于这个问题,我需要返回给定日期的星期几,例如“星期一”、“星期二”。我搜索了堆栈溢出,并决定尝试使用java.time: package Chapter1.Section2; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; import java.time.*; import java.time.format.DateTimeFormatt

我正在处理一个问题集,并试图构建一个返回日期的类。对于这个问题,我需要返回给定日期的星期几,例如“星期一”、“星期二”。我搜索了堆栈溢出,并决定尝试使用java.time:

package Chapter1.Section2;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class exercise_1_2_12 {
    private int day;
    private int month;
    private int year;

    public exercise_1_2_12(int month, int day, int year){
        if (!isDateValid(month, day, year)){
            throw new IllegalArgumentException("Invalid Date!");
        }
        this.month = month;
        this.day = day;
        this.year = year;
    }

    public int day(){
        return day;
    }

    public int month(){
        return month;
    }

    public int year(){
        return year;
    }

    public String toString(){
        //return month() + "-" + day() + "-" + year();
        return  year + "/" + String.format("%02d", month) + "/" + 
        String.format("%02d", day);
    }

    public boolean isDateValid(int month, int day, int year) {
        int[] dayInEachMonthLeapYr = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int[] dayInEachMonthNonLeapYr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        boolean valid = true;


        if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
            if (year < 1 || month < 1 || month > 12 || day < 1 || day > dayInEachMonthLeapYr[month - 1]) {
                valid = false;
            }
        } else {
            if (year < 1 || month < 1 || month > 12 || day < 1 || day > dayInEachMonthNonLeapYr[month - 1]) {
                valid = false;
            }
        }
        return valid;
    }

    public String dayOfWeekName(){
        DateTimeFormatter format = DateTimeFormatter.ofPattern("mm/dd/yyyy");
        String input = this.toString();
        LocalDate date = LocalDate.parse(input, format);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        String result = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US);
        return result;
    }

    public static void main(String[] args){

        StdOut.print("Enter month: ");
        int month = StdIn.readInt();
        StdOut.print("Enter day: ");
        int day = StdIn.readInt();
        StdOut.print("Enter year: ");
        int year = StdIn.readInt();
        exercise_1_2_12 smartDate = new exercise_1_2_12(month,day,year);
        StdOut.println(smartDate);
        smartDate.dayOfWeekName();
    }
}

我不太清楚如何解决这个问题。

看看你的约会模式:

DateTimeFormatter format = DateTimeFormatter.ofPattern("mm/dd/yyyy");
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy/MM/dd");
日期:

'2018/04/01'
自然不匹配

在该模式中输入日期,如:

'04/01/2018'
或者改变模式:

DateTimeFormatter format = DateTimeFormatter.ofPattern("mm/dd/yyyy");
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy/MM/dd");
重要提示:正如评论中所精确指出的,还请注意。当您使用
mm
时,它将与分钟匹配。

使用此格式化程序:

DateTimeFormatter.ofPattern("MM/dd/yyyy")

@伊瓦尔,你完全正确。通常我需要跑一段路才能发现这些模式。好眼力!非常感谢。谢谢!应该使用“yyyy/MM/dd”格式。事实上,mm表示到分钟而不是月份!顺便说一下,您可以在调用时简单地捕获
DateTimeException
来替换
isDateValid
方法:
try{LocalDate ld=LocalDate.of(y,m,d);}catch(DateTimeException e){…处理无效输入…}