Java开发经常要把当前时间转为字符串,比如“2020-07-08 22:59:48”这样,此时会用到格式化工具SimpleDateFormat,该工具通过下列字符表示不同的时间单位:
小写的yyyy:表示四位年份数字,如1949、2017等等。
大写的MM:表示两位月份数字,如01表示一月份,12表示12月份。
小写的dd:表示两位日期数字,如08表示当月八号,26表示当月二十六号。
大写的HH:表示24小时制的两位小时数字,如19表示晚上七点。
小写的mm:表示两位分钟数字,如30表示某个点钟的三十分。
小写的ss:表示两位秒钟数字。
按照“2020-07-08 22:59:48”这种字符串样式,对应的日期格式为“yyyy-MM-dd HH:mm:ss”,于是将日期时间转为字符串的代码如下所示:
// 获取当前的日期时间字符串 public static String getNowDateTime() { // 创建一个日期格式化的工具 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 将当前日期时间按照指定格式输出格式化后的日期时间字符串 return sdf.format(new Date()); }
注意到上述的时间标记有区分大小写,意味着大写字母与小写字母表达的时间是不一样的。例如,大写的MM表示两位月份,而小写的mm表示两位分钟。除此之外,还有以下不怎么常见的时间标记:
大写的YYYY:同样表示四位年份数字,但它并非指定日期所处的年份,而是指定日期所在周的最后一天(星期六)位于哪个年份。
大写的D:表示从当年的1月1日开始算的第几天。
小写的hh:表示12小时制的两位小时数字,如06可同时表示早上六点与傍晚六点。
大写的SSS:表示三位毫秒数字。
以上四种时间标记,特别注意大写的YYYY,因为其他标记不管怎样都是取指定日期的某种单位,可是YYYY居然没从指定日期取数,而是先找到那个日期所处的星期,找到那个星期的最后一天,再瞧瞧最后一天在哪个年份。关键每星期的最后一天究竟是星期几呢?按照中国人的习惯,每周最后一天是星期日,然而在西方人看来,每周最后一天却是星期六,所以YYYY要找的正是那个星期的星期六呀。
话虽如此,还得实地验证一下才行。先看2004年12月31日,当天是星期五,那周的星期六是2005年1月1日,星期日是2005年1月2日。由于不管星期六还是星期日都落在2005年,因此那周的YYYY理应返回2005年,于是编写下面的年份标记验证代码:
try { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse("2004-12-29"); // 2004-12-31是星期五,2005-01-01是星期六 SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY-MM-dd"); String str = sdf2.format(date); System.out.println("str="+str); } catch (ParseException e) { e.printStackTrace(); }
运行上面代码,看到如下所示的输出日志,果然2004年底的YYYY变成了2005。
str=2005-12-29
再看2005年12月31日,当天是星期六,那周的星期日是2006年1月1日。由于那周的星期六落在2005年,而星期日落在2006年,因此那周的YYYY应当返回2005年(如果每周最后一天是星期六的话)。此时年份标记验证代码示例如下:
try { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse("2005-12-29"); // 2005-12-31是星期六,2006-01-01是星期日 SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY-MM-dd"); String str = sdf2.format(date); System.out.println("str="+str); } catch (ParseException e) { e.printStackTrace(); }
运行上面代码,看到如下所示的输出日志,发现2005年底的YYYY仍为2005,从而证明了这个结论:在Java编程当中,星期六才是每周的最后一天。
str=2005-12-29
更多Java技术文章参见《Java开发笔记(序)章节目录》