我正在尝试检查用户是否以特定格式输入了字符串。 我不能使用SimpleDateFormat,catch,split或其他任何东西,因为我还没有学过它。我处于一个非常新手的水平,并学会了如何使用和操纵字符串。 用户输入mm / dd / yyyy(我正在使用JOptionPane),因此它是一个String。我把月,日和年作为子字符串(并转换为整数用于其他用途)。但是,如果输入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.");
}
}
答案 0 :(得分:1)
您可以使用Regex检查用户的输入是否符合您想要的格式。
date = JOptionPane.showInputDialog(null,“请输入日期。请使用格式mm / dd / yyy”); boolean bool = data.match(“[0-9] {2} // [0-9] {2} // [0-9] {4}”);
答案 1 :(得分:0)
我的建议是,使用split
String by delimeter "\"
方法将所有三个值分开,如果用户输入1而不是01,同样适用于dd和mm格式,它将对您有所帮助。现在将此值分配给相应的日期,月份和年份变量。
这是因为尝试输入2013年1月1日这应该是有效格式的有效日期,在这里您使用子字符串功能,导致值1/1/2013抛出java.lang.StringIndexOutOfBoundsException。
现在根据月份验证您的值为1月到12月之间的月份和1到31之间的天数,即1月可以有31天,4月可以有30天等等。
此外,确认具有闰年功能的年份。
我还建议你制作一些函数/方法来模块化你的代码。
答案 2 :(得分:0)
确保其格式正确的最佳方法是不允许用户输入自由格式文本 - 使用日期选择器(日历,下拉菜单等)。
以下是一些Java日期选择器的讨论: What are good Java date-chooser Swing GUI widgets?
答案 3 :(得分:0)
已使用if(year.length != 4)
因为如果以任何其他方式输入日期,则会产生4个字符以外的其他内容。我也更改了它以获得“/”处的字符,因此他们无法输入6 // 23/2013(这将导致4年字符)。