0

我正在尝试检查用户是否以特定格式输入了字符串。我无法使用 SimpleDateFormat、catch、split 或任何类似的东西,因为我还没有学会它。我处于非常新手的水平,并且已经学会了如何使用和操作字符串。用户要输入 mm/dd/yyyy(我正在使用 JOptionPane),所以它是一个字符串。我已将月、日和年作为子字符串提取(并转换为整数以供其他用途)。但是,如果输入 m/dd/yy,一切都会出错。由于不能信任人们遵循指示,我需要一些东西来捕捉不正确的条目。我已经了解了公历,但不确定是否会有所帮助。最后,我需要使用数组将 mm/dd/yyyy 转换为 MMM/dd/yyyy。所以我要先检查输入是否有效,然后转换为整数并使用数字与月份数组重合,然后确保日期在月份的天数内。最后,我需要给出一年中的哪一天,这就是我将(?)解析为整数的原因。只要用户正确输入,其他一切都可以正常工作。随意建议任何其他编辑。我确实尝试过使用一个对象,但是使用它非常困难,所以改为并行数组。

import javax.swing.*;
import java.util.*;
public class ConvertDate
{
    public static void main(String[] agrs)
{

        int numOfDay;
        String date, mnthName = "";
        int monthNumber, dayNumber, yearNumber;
        String month = "", day = "", year = "";
        int validDays = 31;

        int monthNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
        String[] monthName = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 
        int[] daysInMonth = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        date = JOptionPane.showInputDialog(null, "Please enter a date. Use format mm/dd/yyy");
        month = date.substring(0, 2);
        day = date.substring(3, 5);
        year = date.substring(6, 10);
        yearNumber = Integer.parseInt(year);
        monthNumber =  Integer.parseInt(month);
        dayNumber = Integer.parseInt(day);

        for(int x = 0; x < 12; x++)
        {
            if(monthNumber == monthNum[x])
            {
                mnthName = monthName[x];
                validDays = daysInMonth[x];
            }
        }

        GregorianCalendar dayOfYear = new GregorianCalendar(yearNumber, (monthNumber - 1), dayNumber);
        numOfDay = dayOfYear.get(GregorianCalendar.DAY_OF_YEAR);

        if(dayNumber > validDays || dayNumber < 0 || monthNumber < 0 || monthNumber > 12)
// if(!date.equals("**/**/****"))  does not work, nor if(!date.equals(**"/"**"/"****))
            JOptionPane.showMessageDialog(null, "Invalid date or invalid format.");
        else
            JOptionPane.showMessageDialog(null, mnthName + " " + dayNumber + ", " + year + " is \nthe " + numOfDay + " day of the year.");

    }       
}
4

4 回答 4

1

您可以使用 Regex 来检查用户的输入是否与您想要的格式匹配。

date = JOptionPane.showInputDialog(null, "请输入日期。使用格式 mm/dd/yyy"); boolean bool = data.match("[0-9]{2}//[0-9]{2}//[0-9]{4}");

于 2013-09-29T06:12:40.847 回答
0

我的建议是split用分隔符的 String 方法分隔所有三个值,"\"如果用户输入 1 而不是 01 以及 dd 和 mm 格式,这将对您有所帮助。现在将此值分配给相应的日期、月份和年份变量。

这是因为尝试输入 2013 年 1 月 1 日,这应该是一个具有有效格式的有效日期,这里您使用子字符串功能导致值 2013 年 1 月 1 日抛出 java.lang.StringIndexOutOfBoundsException。

现在根据月份验证您的值是 1 月到 12 月之间的月份和 1 到 31 之间的天数,即 1 月可以有 31 天,4 月可以有 30 天,依此类推。

此外,使用闰年功能验证年份。

我还建议您制作一些函数/方法来模块化您的代码。

于 2013-09-29T05:31:59.380 回答
0

确保其格式正确的最佳方法是不允许用户输入自由格式的文本——改用日期选择器(日历、下拉菜单等)。

这里讨论一些 Java 日期选择器: 什么是好的 Java 日期选择器 Swing GUI 小部件?

于 2013-09-29T06:23:52.830 回答
0

使用if(year.length != 4)因为如果以任何其他方式输入日期,它将导致 4 个字符以外的内容。我还更改了它以获取“/”处的字符,因此它们无法输入 6//23/2013(这将导致 4 年字符)。

于 2013-09-29T15:20:20.347 回答