对日期进行格式化
要求
用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台重复输入时间.格式化的时间参考企业微信聊天记录的展示时间.
练习代码实现
public class DateTimeTest {
public static void main(String[] args) {
// 获取控制台输入
Scanner scanner = new Scanner(System.in);
System.out.println("请你输入合法日期,输入exit退出程序");
System.out.println("列如:XXXX-XX-XX XX:XX");
// 判断是否有下一行输入
a: while (scanner.hasNextLine()) {
String str = scanner.nextLine();
if (str.equals("exit")) {
System.out.println("程序结束");
break a;
} else {
String S = DateTime.SpiltDateTime(str);
if (DateTime.testNot(S)) {
System.out.println("当前时间:" + S);
} else {
}
}
}
}
}
public class DateTime {
public static final String ILLEGAL_TIME = "时间不合法";
public static final String ILLEGAL_DATE = "日期不合法";
public static final String ILLEGAL_LENGTH = "日期长度不合法";
// 大月
private static int[] bigMonth = new int[] { 1, 3, 5, 7, 8, 10, 12 };
// 小月
private static int[] smallMonth = new int[] { 4, 6, 9, 11 };
/**
* 分割时间日期
*
* @param str 要处理的日历
* @return 分割后的时间日期
*/
public static String SpiltDateTime(String str) {
if (str == null) {
return "传入日期不能为空";
} else if (str.length() < 12 || str.length() > 17) {
return "日历长度不合法请你重新输入";
}
if (!str.contains(" ")) {
return "请以空格作为日期和时间的分隔符";
}
// 将时间进行分割
String[] splitdatetime = str.split(" ");
// 分割后的日期
String date = splitdatetime[0];
// 分割后的时间
String Time = splitdatetime[1];
return SplitDate(date) + " " + disposeTime(Time);
}
/**
* 判断输入日期是否合法
*
* @param s 日期
* @return 处理后的日期
*/
public static boolean testNot(String s) {
if (s.contains(ILLEGAL_DATE)) {
System.out.println(ILLEGAL_DATE);
return false;
} else if (s.contains(ILLEGAL_TIME)) {
System.out.println(ILLEGAL_TIME);
return false;
} else if (s.contains(ILLEGAL_LENGTH)) {
System.out.println(ILLEGAL_LENGTH);
return false;
}
return true;
}
/**
* 分割日期
*
* @param str
* @return
*/
public static String SplitDate(String str) {
// 判断传入字符串对象是否合法
if (str.length() < 8 || str.length() > 10) {
return ILLEGAL_LENGTH;
}
boolean bool = str.contains(".") || str.contains("/") || str.contains("-") ? false : true;
if (bool) {
return ILLEGAL_DATE;
}
// 获取分割后的年月日
String[] date = splitDate(str);
for (int i = 0; i < date.length; i++) {
if (!isNowbet(date[i])) {
return ILLEGAL_DATE;
}
}
int year = Integer.valueOf(date[0]);// 获取输出年
int month = Integer.valueOf(date[1]);// 获取输出月
int day = Integer.valueOf(date[2]);// 获取输出天
Year y1 = Year.now();// 获取当前年
// 输出年不能大于
if (year < 1970 || year > y1.getValue()) {
return ILLEGAL_DATE;
} else if (month < 1 || month > 12) {
return ILLEGAL_DATE;
} else if (day < 1 || day > 31) {
return ILLEGAL_DATE;
}
return DisposeYearMonthDate(year, month, day);
}
/**
* 对日期进行分割
*
* @param date 分割日期
* @return 分割后的日期
*/
private static String[] splitDate(String date) {
if (date.contains(".")) {
String[] splitDate = date.split("\\.");
return splitDate;
} else if (date.contains("-")) {
String[] splitDate = date.split("-");
return splitDate;
} else if (date.contains("/")) {
String[] splitDate = date.split("/");
return splitDate;
}
return null;
}
/**
* 处理相同年
*
* @param Year 年
* @param Month 月
* @param Day 日
* @return 处理后的年月日
*/
private static String DisposeYearMonthDate(int year, int month, int day) {
// 使用二分查找法判断月份是否是大月,如果查到会返回该数组的索引
if (Arrays.binarySearch(bigMonth, month) >= 0) {
if (month > 31) {
System.out.println("月份是大月,本月只有31天");
return ILLEGAL_DATE;
}
} else if (Arrays.binarySearch(smallMonth, month) >= 0) {
if (month > 30) {
return ILLEGAL_DATE;
}
}
// 获取当前年月日
int currentYear = Year.now().getValue();// 获取当前年
int currentMonth = MonthDay.now().getMonthValue();// 获取当前月
int currentDay = MonthDay.now().getDayOfMonth();// 获取当前天
// 判断传入年是否是同一年
if (year == currentYear) {
// 闰年
if (JudgeYear(year)) {
if (month == 2) {
if (day > 29) {
return ILLEGAL_DATE;
}
}
// 平年
} else {
if (month == 2) {
if (day > 28) {
return ILLEGAL_DATE;
}
}
}
// 判断传入月是否与当前月相等
if (month == currentMonth) {
if (day == currentDay) {
return "今天";
} else if (day - 1 == currentDay) {
return "昨天";
} else {
return day + "日";
}
} else {
return month + "月" + day + "日";
}
// 不同年
} else {
// 闰年
if (JudgeYear(year)) {
if (month == 2) {
if (day > 29) {
return ILLEGAL_DATE;
}
}
// 平年
} else {
if (month == 2) {
if (day > 28) {
return ILLEGAL_DATE;
}
}
}
return year + "年" + month + "月" + day + "日";
}
}
/**
* 判断闰年平年
*
* @param year 传入年
* @return true false;
*/
private static boolean JudgeYear(int year) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
return true;
} else {
return false;
}
}
/**
* 判断时间是否合法
*
* @param Time 时间
* @return 处理后的时间
*/
public static String disposeTime(String Time) {
if (Time.length() < 3 || Time.length() > 5) {
return ILLEGAL_DATE;
}
if (!Time.contains(":")) {
return ILLEGAL_DATE;
}
String[] time = Time.split(":");
for (int i = 0; i < time.length; i++) {
if (!isNowbet(time[i])) {
return ILLEGAL_TIME;
}
}
int Hour = Integer.valueOf(time[0]);// 小时
int minute = Integer.valueOf(time[1]);// 分钟
return Time(Hour, minute);
}
/**
* 格式化时分
*
* @param Hour 时
* @param minute 分
* @return 处理后的时分
*/
private static String Time(int Hour, int minute) {
if (Hour > 23 || minute > 59) {
return ILLEGAL_DATE;
}
String var = Hour > 12 ? "下午" : "上午";
return var + Hour + "时" + minute + "分";
}
/**
* 判断传入日期是否是合法数字
*
* @param str 日期
* @return 判断后的日期
*/
private static boolean isNowbet(String str) {
boolean bool = false;
// 将获取到的亲字符串转换成数组
char[] charArray = str.toCharArray();
for (char c : charArray) {
bool = 48 <= c && c <= 57 ? true : false;
}
return bool;
}
}
```**加粗样式**