欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用DateTimeFormatter格式化输入的日期时间

程序员文章站 2023-08-24 20:10:14
要求: 用datetimeformatter实现: 用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台...

要求:

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

分析:

1.时间的常用格式为:

xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
xxxx.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
则格式化结果为:
下午 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\t xxxx.xx.xx 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.leep_year.getstr();
 /**
 * 平年正则
 */
 private final static string common_year = regex.common_year.getstr();
 /**
 * 时间正则
 */
 private final static string time = regex.time.getstr();
 /**
 * 退出正则
 */
 private final static string exit = regex.exit.getstr();

 /**
 * 静态初始化块
 */
 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 = scanner.nextline().trim();
  // 对输入的字符进行判断
  if (str.matches(exit)) {
  // 程序退出
  hint.end_of_program.println();
  // 关闭扫描器
  scanner.close();
  // 退出虚拟机
  system.exit(0);
  // 判断平闰年
  } 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_day_time.getstr();
 /**
 * 月日 时分
 */
 private static final string month_day_time = pattern.month_day_time.getstr();
 /**
 * 星期 时分
 */
 private static final string week_time = pattern.week_time.getstr();
 /**
 * 上下午 时分
 */
 private static final string time = pattern.time.getstr();
 /**
 * 昨天 时分
 */
 private static final string yesterday = pattern.yesterday.getstr();
 /**
 * 明天 时分
 */
 private static final string tomorrow = pattern.tomorrow.getstr();
 /**
 * 当前年
 */
 private static int currentyear = year.now().getvalue();
 /**
 * 当前月
 */
 private static int currentmonth = monthday.now().getmonthvalue();
 /**
 * 当前日
 */
 private static int currentday = monthday.now().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 (date.contains(".")) {
  splitter = "\\.";
 } else if (date.contains("-")) {
  splitter = "-";
 } else if (date.contains("/")) {
  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");
 // 将字符串解析成日期时间对象
 localdatetime parse = localdatetime.parse(str1, ofpattern);
 // 同一年
 if (year == currentyear) {
  // 同一月
  if (month == currentmonth) {
  // 同一天
  if (day == currentday) {
   // 今天
   printdatetime(time, parse);
  } else if (day - currentday == 1) {
   // 明天
   printdatetime(tomorrow, parse);
  } else if (day - currentday == -1) {
   // 昨天
   printdatetime(yesterday, parse);
  } else if (day - currentday >= -7 && day - currentday <= -2) {
   // 向前一周以星期来表示
   printdatetime(week_time, parse);
  } else {
   // 不同天
   printdatetime(month_day_time, parse);
  }
  // 下个月
  } else if (month - currentmonth == 1) {
  // 如果输入的日是1,则判断当前月和天
  if (day == 1) {
   // 判断是大月小月还是二月,如果当前天数是月份最后一天,则输出明天
   if (arrays.binarysearch(bigmonth, currentmonth) >= 0 && currentday == 31) {
   // 明天
   printdatetime(tomorrow, parse);
   return;
   } else if (arrays.binarysearch(smallmonth, currentmonth) >= 0 && currentday == 30) {
   // 明天
   printdatetime(tomorrow, parse);
   return;
   } else if (currentmonth == 2) {
   // 判断输入的是闰年还是平年
   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    if (currentday == 29) {
    // 明天
    printdatetime(tomorrow, parse);
    return;
    }
   } else {
    if (currentday == 28) {
    // 明天
    printdatetime(tomorrow, parse);
    return;
    }
   }
   } else {
   // 使用月日进行输出
   printdatetime(month_day_time, parse);
   }
  } else {
   // 输入的日不是1,这输出月日时分
   printdatetime(month_day_time, parse);
  }
  // 上一月
  } else if (month - currentmonth == -1) {
  // 如果当前日是1,则判断输入日是否是上月最后一天
  if (currentday == 1) {
   // 判断是大月小月还是二月,输入的天数是不是月份的最后一天,是则是昨天
   if (arrays.binarysearch(bigmonth, month) >= 0 && day == 31) {
   // 昨天
   printdatetime(yesterday, parse);
   return;
   } else if (arrays.binarysearch(smallmonth, month) >= 0 && day == 30) {
   // 昨天
   printdatetime(yesterday, parse);
   return;
   } else if (month == 2) {
   // 判断是闰年还是平年
   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    if (day == 29) {
    // 昨天
    printdatetime(yesterday, parse);
    return;
    }
   } else {
    if (day == 28) {
    // 昨天
    printdatetime(yesterday, parse);
    return;
    }
   }
   }
  }
  // 如果当前日不小于7,则输入月日时分,小于7则从当前天往前一周转换为星期
  if (currentday >= 7) {
   // 输出月日时分
   printdatetime(month_day_time, parse);
   // 如果当前天小于7,则当前天向前一周转换为星期
  } else if (arrays.binarysearch(bigmonth, month) >= 0 && 31 - day + currentday < 7) {
   // 年月日转换为星期
   printdatetime(week_time, parse);
  } else if (arrays.binarysearch(smallmonth, month) >= 0 && 30 - day + currentday < 7) {
   // 年月日转换为星期
   printdatetime(week_time, parse);
  } else if (month == 2) {
   // 判断是闰年还是平年
   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
   if (29 - day + currentday < 7) {
    // 年月日转换为星期
    printdatetime(week_time, parse);
   } else {
    // 如果向前超出了一周输出月日时分
    printdatetime(month_day_time, parse);
   }
   } else {
   if (28 - day + currentday < 7) {
    // 年月日转换为星期
    printdatetime(week_time, parse);
   } else {
    // 如果向前超出了一周输出月日时分
    printdatetime(month_day_time, parse);
   }
   }
  } else {
   // 当前天向前超出了一周输出月日时分
   printdatetime(month_day_time, parse);
  }
  } else {
  // 不同月,输出月日时分
  printdatetime(month_day_time, parse);
  }
 } else {
  // 不同年,输出年月日时分
  printdatetime(year_month_day_time, parse);
 }
 }

 /**
 * 格式化结果
 * 
 * @param pattern 模式字符串
 * @param datetime 时间
 */
 private static void printdatetime(string pattern, localdatetime datetime) {
 // 通过模式字符串对时间进行格式化
 datetimeformatter ofpattern = datetimeformatter.ofpattern(pattern);
 // 打印格式化后的时间
 system.out.println("格式化结果:\n\t" + ofpattern.format(datetime));
 }

}

代码测试结果:

请输入日期时间:
常用格式:xxxx-xx-xx xx:xx
   xxxx/xx/xx xx:xx
   xxxx.xx.xx xx:xx
exit:程序退出
请输入:
2020-1-11 12:22
格式化结果:
 下午 12:22
exit:程序退出
请输入:
2020-1-11 2:22
格式化结果:
 上午 02:22
exit:程序退出
请输入:
2020-1-10 1:22
格式化结果:
 昨天 01:22
exit:程序退出
请输入:
2020-1-7 12:22
格式化结果:
 周二 12:22
exit:程序退出
请输入:
2020-1-12 12:22
格式化结果:
 明天 12:22
exit:程序退出
请输入:
2020-1-13 12:22
格式化结果:
 1月13日 12:22
exit:程序退出
请输入:
2020-2-22 12:22
格式化结果:
 2月22日 12:22
exit:程序退出
请输入:
2019-12-31 12:22
格式化结果:
 2019年12月31日 12:22
exit:程序退出
请输入:

更多情况测试,或者代码简化,请自行探索测试

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。