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开发笔记(序)章节目录

Java开发笔记(一百五十二)Date工具的时间格式的更多相关文章

  1. Java开发笔记(五十二)对象的类型检查

    前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...

  2. Java开发笔记(八十二)注解的基本单元——元注解

    Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...

  3. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  4. Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  5. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

  6. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  7. Java开发笔记(五十四)内部类和嵌套类

    通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...

  8. Java开发笔记(五十五)关键字static的用法

    前面介绍嵌套类的时候讲到了关键字static,用static修饰类,该类就变成了嵌套类.从嵌套类的用法可知,其它地方访问嵌套类之时,无需动态创建外层类的实例,直接创建嵌套类的实例就行.其实static ...

  9. Java开发笔记(五十八)简单接口及其实现

    前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...

  10. Java开发笔记(五十九)Java8之后的扩展接口

    前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...

随机推荐

  1. Graph4Stream:基于图的流计算加速

    作者:汪煜 之前在「姊妹篇」<Stream4Graph:动态图上的增量计算>中,向大家介绍了在图计算技术中引入增量计算能力「图+流」,GeaFlow流图计算相比Spark GraphX取得 ...

  2. Linux内存管理神器:smem工具

    大家好,我是良许. 今天给大家分享一款 Linux 系统里的内存管理神器:smem . smem 是Linux系统上的一款可以生成多种内存耗用报告的命令行工具.与现有工具不一样的是 smem 可以报告 ...

  3. java基础之二分查找,可变参运用

    一. public class BinarySeachTest { public static void main(String[] args) { int[] arr = new int[]{22, ...

  4. 配置Thymeleaf模板引擎

    1).thymeleaf-starter: 关闭缓存 2).静态资源都放在static文件夹下就可以按照路径直接访问 3).页面放在templates下,直接访问 springboot ,访问项目的时 ...

  5. 康谋方案 | 基于AI自适应迭代的边缘场景探索方案

    构建巨量的驾驶场景时,测试ADAS和AD系统面临着巨大挑战,如传统的实验设计(Design of Experiments, DoE)方法难以有效覆盖识别驾驶边缘场景案例,但这些边缘案例恰恰是进一步提升 ...

  6. uniapp阻止Modal模态框关闭

    要阻止uniapp的Modal模态框关闭,没有找到相关api,但可以通过保存配置立即打开的方式变相实现阻止关闭: const option = { title: "输入礼品券名称" ...

  7. 网鼎杯-phpweb

    找了一些php读取文件的函数尝试读取源码,试了一个readfile就成功了 <?php $disable_fun = array("exec","shell_exe ...

  8. 1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF.图像.Offic ...

  9. K8s新手系列之K8s架构

    应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署 互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分 ...

  10. 在postman中为每个测试用例添加相同的请求头

    最近在学习的时候看到可以在postman中可以为每个测试用例添加相同的请求头,这个就不用单独去设置了,可以说是非常好用,遂记录一下. 具体设置如下: https://postman.org.cn/