对时间格式化

对日期进行格式化

要求

用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台重复输入时间.格式化的时间参考企业微信聊天记录的展示时间.

练习代码实现

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;

	}

}
```**加粗样式**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值