Java使⽤DateTimeFormatter格式化输⼊的⽇期时间
要求:
⽤DateTimeFormatter实现: ⽤扫描器获取输⼊的时间(年⽉⽇时分),这个时间的格式是常⽤的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台重复输⼊时间.格式化的时间参考企业聊天记录的展⽰时间
分析:
1.时间的常⽤格式为:
xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
< xx:xx
等格式
2.显式时间格式为:
今天显式: 00:01 - 23:59 ;
昨天显式: 昨天 01:01 ;
前天显式: 周⼏ 02:02
往前推⼀周都显式: 周⼏ 02:02 ;
时间再往前推只显⽰: ⼏⽉⼏⽇ 02:02
不同年则显式: ⼏年⼏⽉⼏⽇ 02:02
也可考虑写⼀个明天显式: 明天 02:02
其余时间显式: ⼏⽉⼏⽇ 02:02
3.考虑特殊情况下的⽇期:
⽐如当前天是1号
则上个⽉的最后⼀天是昨天
往前推⼀周则显式:星期⼏ 02:02
如果当前天不⼤于7号
则向前推⼀周到了上个⽉
也要考虑将其转换为星期
4.先输⼊⼀个时间,再对这个时间使⽤DateTimeFormatter进⾏格式化
⽐如:
输⼊: 2020-1-11 12:22
java时间日期格式转换则格式化结果为:
下午 12:22
代码实现
程序开始:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* 程序开始⼊⼝ <br>
* 2020年1⽉9⽇下午7:10:04
*
* @author wcf
* @version 1.0
*/
public class Test {
/**
* 程序⼊⼝
*
* @param args ⼊⼝参数
*/
public static void main(String[] args) {
// 程序开始运⾏
DateTimeFormatterTest.inoutDateTime();
}
}
⽇期时间等需要⽤到的正则表达式:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* ⽇期时间的正则表达式 <br>
* 2020年1⽉9⽇下午7:25:11
*
* @author wcf
* @version 1.0
*/
public enum Regex {
/**
* 匹配闰年
*/
LEEP_YEAR("((\\d{2}(0[48]|[2468][048]|[13579][26]))|((0[48]|[2468][048]|[13579][26])00))[-\\/\\.]0?2[-\\/\\.]29"),
/**
* 匹配平年
*/
COMMON_YEAR("(\\d{3}[1-9]|\\d{2}[1-9]\\d|\\d[1-9]\\d{2}|[1-9]\\d{3})[-\\/\\.]((0?[13578]|1[02])[-\\/\\.](0?[1-9]|[12]\\d|3[01])|((0?[469]|11)[-\\/\\.](0?[1-9]|[12]\\d|30))|(0?2[-\\/\\.](0?[1-9]|1\\d|2[0-8])))"), /**
* 匹配时间
*/
TIME(" ([01]?\\d|2[0-3]):[0-5]?\\d"),
/**
* 退出程序
*/
EXIT("exit|退出");
/**
* 正则
*/
private final String str;
/**
* 有参构造器
*
* @param string 正则
*/
private Regex(String string) {
this.str = string;
}
/**
* 获取正则
*
* @return 正则
*/
public String getStr() {
return str;
}
}
提⽰信息:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* 提⽰信息 <br>
* 2020年1⽉9⽇下午7:25:53
*
* @author wcf
* @version 1.0
*/
public enum Hint {
/**
* 请输⼊⽇期时间
*/
INPUT_DATE_TIME("请输⼊⽇期时间:"),
/**
* ⽇期时间格式
*/
DATETIMEFORMAT("常⽤格式:xxxx-xx-xx xx:xx\n\t xxxx/xx/xx xx:xx\n\ xx:xx"),
/**
* ⽇期错误
*/
INVOKE_DATE("⽇期错误"),
/**
* 时间错误
*/
INVOKE_TIME("时间错误"),
/**
* ⽇期时间错误
*/
INVOKE_DATE_TIME("⽇期时间错误!"),
/**
* 继续或退出
*/
CONTINUE_OR_QUIT("exit:程序退出\n请输⼊:"),
/
**
* 程序结束
*/
END_OF_PROGRAM("退出成功,程序结束!");
/**
* 提⽰
*/
private final String str;
/**
* 有参构造器
*
* @param str 提⽰
*/
private Hint(String str) {
this.str = str;
}
/**
* 获取提⽰
*/
public void println() {
System.out.println(str);
}
}
⽇期时间格式化的模板字符串:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* ⽇期时间格式化的模板字符串 <br>
* 2019年3⽉1⽇下午7:17:19
*
* @author wcf
* @version 1.0
*/
public enum Pattern {
/
**
* 上下午时分
*/
TIME("a HH:mm"),
/**
* 昨天时分
*/
YESTERDAY("昨天 HH:mm"),
/**
* 明天时分
*/
TOMORROW("明天 HH:mm"),
/**
* 星期时分
*/
WEEK_TIME("E HH:mm"),
/**
* ⽉⽇时分
*/
MONTH_DAY_TIME("M⽉d⽇ HH:mm"),
/**
* 年⽉⽇时分
*/
YEAR_MONTH_DAY_TIME("y年M⽉d⽇ HH:mm");
/**
* 显式模式
*/
private final String str;
/**
* 有参数构造器
*
* @param str 模式
*/
private Pattern(String str) {
this.str = str;
}
/**
* 获取显式模式
*
* @return 显式模式
*/
public String getStr() {
return str;
}
}
输⼊⽇期时间进⾏处理:
package hrkj.chapter7.dateTimeFormatter.Test1;
import java.util.Scanner;
/**
* 输⼊⽇期时间进⾏处理 <br>
* 2020年1⽉9⽇下午7:09:31
*
* @author wcf
* @version 1.0
*/
public class DateTimeFormatterTest {
/**
* 闰年正则
*/
private final static String LEEP_YEAR = Regex.Str(); /**
* 平年正则
*/
private final static String COMMON_YEAR = Regex.Str();
/**
* 时间正则
*/
private final static String TIME = Str();
/**
* 退出正则
*/
private final static String EXIT = Str();
/**
* 静态初始化块
*/
static {
// 输⼊提⽰
Hint.INPUT_DATE_TIME.println();
/
/ ⽇期时间格式
Hint.DATETIMEFORMAT.println();
// 退出指令
Hint.CONTINUE_OR_QUIT.println();
}
/**
* 私有构造器
*/
private DateTimeFormatterTest() {
// 私有构造器
// ⽆法创建本类实例
}
/**
* 输⼊⽇期时间
*/
public static void inoutDateTime() {
// 扫描器
Scanner scanner = new Scanner(System.in);
// 扫描控制台输⼊
while (scanner.hasNextLine()) {
// 接收控制台输⼊,并去除输⼊前后的空格
String str = Line().trim();
/
/ 对输⼊的字符进⾏判断
if (str.matches(EXIT)) {
// 程序退出
Hint.END_OF_PROGRAM.println();
// 关闭扫描器
scanner.close();
// 退出虚拟机
// 判断平闰年
} else if (str.matches(LEEP_YEAR + TIME) || str.matches(COMMON_YEAR + TIME)) {
// 对输⼊的⽇期时间字符串进⾏格式化
DateTimeFormatterTools.format(str);
// 格式化后提⽰
Hint.CONTINUE_OR_QUIT.println();
} else {
// 输⼊的⽇期时间不正确
Hint.INVOKE_DATE_TIME.println();
// 输⼊提⽰
Hint.INPUT_DATE_TIME.println();
continue;
}
}
}
}
对输⼊的⽇期时间进⾏处理:
package hrkj.chapter7.dateTimeFormatter.Test1;
import java.time.LocalDateTime;
import java.time.MonthDay;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
/**
* 对输⼊的⽇期时间进⾏处理 <br>
* 2020年1⽉9⽇下午8:08:45
*
* @author wcf
* @version 1.0
*/
public class DateTimeFormatterTools {
/**
* 年⽉⽇时分
*/
private static final String YEAR_MONTH_DAY_TIME = Pattern.YEAR_MONTH_Str(); /**
* ⽉⽇时分
*/
private static final String MONTH_DAY_TIME = Pattern.MONTH_Str();
/**
* 星期时分
*/
private static final String WEEK_TIME = Pattern.Str();
/**
* 上下午时分
*/
private static final String TIME = Str();
/**
* 昨天时分
*/
private static final String YESTERDAY = Str();
/**
* 明天时分
*/
private static final String TOMORROW = Str();
/**
* 当前年
*/
private static int currentYear = w().getValue();
/
**
* 当前⽉
*/
private static int currentMonth = w().getMonthValue();
/**
* 当前⽇
*/
private static int currentDay = w().getDayOfMonth();
/**
* ⼤⽉
*/
private static int[] bigMonth = { 1, 3, 5, 7, 8, 10, 12 };
/**
* ⼩⽉
*/
private static int[] smallMonth = { 4, 6, 9, 11 };
/**
* 私有构造器
*/
private DateTimeFormatterTools() {
// 私有构造器,⽆法实例化
}
/
**
* 处理输⼊的⽇期时间
*
* @param str 输⼊的⽇期时间
*/
public static void format(String str) {
// 将⽇期和时间⽤空格进⾏分割
String[] datetime = str.split(" ");
// 分割成的⽇期
String date = datetime[0];
// 分割成的时间
String time = datetime[1];
// ⽇期分割⽅式
String splitter = "";
// ⽇期可以⽤- . / 进⾏分割
// 如果包含了-./这三种中的⼀种,则⽤这些进⾏分割
if (ains(".")) {
splitter = "\\.";
} else if (ains("-")) {
splitter = "-";
} else if (ains("/")) {
splitter = "/";
}
// 使⽤⽇期的分割⽅式对⽇期进⾏分割
String[] dateString = date.split(splitter);
// 使⽤:对时间进⾏分割,时间只能⽤:进⾏分割
String[] timeString = time.split(":");
// 时间分割后的数组长度不是2则错误,因为输⼊的的时间只有时和分
if (timeString.length != 2) {
// 时间错误
Hint.INVOKE_TIME.println();
return;
}
/
/ ⽇期分割后的数组长度不是3则错误,因为输⼊的⽇期要有年,⽉和⽇
if (dateString.length != 3) {
// ⽇期错误
Hint.INVOKE_DATE.println();
return;
}
// 输⼊的年
int year = Integer.valueOf(dateString[0]);
// 输⼊的⽉
int month = Integer.valueOf(dateString[1]);
// 输⼊的⽇
int day = Integer.valueOf(dateString[2]);
// 输⼊的时
int hour = Integer.valueOf(timeString[0]);
// 输⼊的分
int minute = Integer.valueOf(timeString[1]);
// 对拆解判断过的字符串进⾏重新组合
String str1 = year + splitter + month + splitter + day + " " + hour + ":" + minute;
// 对组合后的字符串进⾏解析
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("y" + splitter + "M" + splitter + "d" + " H:m"); // 将字符串解析成⽇期时间对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论