Java开发笔记(四十)日期与字符串的互相转换
前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰、简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述。既然日期时间存在约定俗成的习惯表达,那就有劳程序员手工把日期时间转换成字符串呗,于是利用String类型的format方法,可将各个时间单位按照规定格式拼接成符合要求的字符串。下面是通过String.format方法转换日期时间的代码例子:
Date date = new Date();
// 手工拼接指定格式的日期时间字符串
String dateTimeDesc = String.format("%d-%d-%d %d:%d:%d",
date.getYear()+1900, date.getMonth()+1, date.getDate(),
date.getHours(), date.getMinutes(), date.getSeconds());
System.out.println("dateTimeDesc="+dateTimeDesc);
运行上面的格式化代码,得到的日志结果如下所示:
dateTimeDesc=2018-11-25 11:18:53
虽然利用String.format方法能够得到大众熟知的日期时间串,可是这个办法实在太拖沓冗长了,一个简简单单的功能却写了好几行代码。为此Java又提供了专门的日期格式化工具SimpleDateFormat,首先为该工具创建一个指定格式的格式化实例,然后调用它的format方法,即可将某个日期实例转换为规定格式的字符串。按照以上步骤编写的格式化代码例子如下:
// 获取当前的日期时间字符串
public static String getNowDateTime() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将当前日期时间按照指定格式输出格式化后的日期时间字符串
return sdf.format(new Date());
}
注意到上述代码的日期时间格式存在大小写字母揉合的情况,为避免混淆,有必要对这些格式字符串进行取值说明,详述如下:
小写的yyyy:表示四位年份数字,如1949、2017等等。
大写的MM:表示两位月份数字,如01表示一月份,12表示12月份。
小写的dd:表示两位日期数字,如08表示当月八号,26表示当月二十六号。
大写的HH:表示24小时制的两位小时数字,如19表示晚上七点。
小写的hh:表示12小时制的两位小时数字,如06可同时表示早上六点与傍晚六点;因为12小时制的表达会引发歧义,所以实际开发中很少这么使用。
小写的mm:表示两位分钟数字,如30表示某个点钟的三十分。
小写的ss:表示两位秒钟数字。
大写的SSS:表示三位毫秒数字。
其余的横线“-”、空格“ ”、冒号“:”、点号“.”等字符,仅仅是连接符号,方便观看各种单位的时间数字而已;对于中文世界来说,也可采用形如“yyyy年MM月dd日HH时mm分ss秒”的格式标记。
现在有了日期格式化工具SimpleDateFormat,以及每个时间单位的标记字符,想要输出特定格式的日期时间串就易如反掌了。譬如只需单独的日期串,无需后面的时间串,则可指定格式化标记为“yyyy-MM-dd”,相应的日期格式化代码如下所示:
// 获取当前的日期字符串
public static String getNowDate() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 将当前日期按照指定格式输出格式化后的日期字符串
return sdf.format(new Date());
}
又如仅需单独的时间串,无需前面的日期串,则可指定格式化标记为“HH:mm:ss”,相应的时间格式化代码如下所示:
// 获取当前的时间字符串
public static String getNowTime() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
// 将当前时间按照指定格式输出格式化后的时间字符串
return sdf.format(new Date());
}
以上的时间格式化只精确到秒,若需精确到毫秒,则可在原来的时间标记末尾添加“.SSS”,表示输出的时间串需要补充三位毫秒数字,此时的时间格式化代码如下所示:
// 获取当前的时间字符串(精确到毫秒)
public static String getNowTimeDetail() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
// 将当前时间按照指定格式输出格式化后的时间字符串(精确到毫秒)
return sdf.format(new Date());
}
有时候考虑到代码内部的方便处理,要求日期时间串为不带任何标点的纯数字串,那么可采取形如“yyyyMMddHHmmss”的日期时间标记,于是将格式化代码改写成下面这样:
// 获取当前的日期时间字符串(纯数字,不包含其它标点符号)
public static String getSimpleDateTime() {
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
// 将当前日期时间按照指定格式输出格式化后的日期时间字符串
return sdf.format(new Date());
}
SimpleDateFormat的作用并不限于将日期类型转换为字符串类型,它还支持将字符串转换为日期类型,这时用到的便是parse方法。具体的转换步骤依旧分成两步,第一步先创建一个指定标记的格式化实例,第二步调用该实例的parset方法,即可将某个对应格式的字符串转换为日期实例。以下代码演示了如何把字符串转换为日期类型的过程:
String str = "2018-11-25 11:18:53";
// 创建一个日期格式化的工具
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 从字符串中按照指定格式解析日期时间信息
Date dateFromStr = sdf.parse(str);
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(四十)日期与字符串的互相转换的更多相关文章
- Java开发笔记(十四)几种运算符的优先级顺序
到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...
- Java开发笔记(十九)规律变化的for循环
前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...
- Java学习笔记四:三目运算符与字符串连接符等
一 .三目运算符与自增自减 GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac02.java 条件运算符由 ...
- Java开发笔记(十)一元运算符的技巧
前面讲到赋值运算符的时候,提到“x = x+7”可以被“x += 7”所取代,当然Java编程中给某个变量自加7并不常见,常见的是给某变量自加1,就像走台阶,一般都是一级一级台阶地走,犯不着一下子跳上 ...
- Java开发笔记(十二)布尔变量论道与或非
在编程语言的设计之初,它们除了可以进行数学计算,还常常用于逻辑推理和条件判断.为了实现逻辑判断的功能,Java引入了一种布尔类型boolean,用来表示“真”和“假”.该类型的变量只允许两个取值,即t ...
- Java开发笔记(十五)短路逻辑运算的优势
前面提到逻辑运算只能操作布尔变量,这其实是不严谨的,因为经过Java编程实现,会发现“&”.“|”.“^”这几个逻辑符号竟然可以对数字进行运算.譬如下面的代码就直接对数字分别开展了“与”.“或 ...
- Java开发笔记(十六)非此即彼的条件分支
前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向.在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Jav ...
- Java开发笔记(十八)上下求索的while循环
循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...
- Java开发学习(四十)----MyBatisPlus入门案例与简介
一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
随机推荐
- ARVE: Augmented Reality Applications in Vehicle to Edge Networks
ARVE:车辆到边缘网中的增强现实应用 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文.由于时间仓促 ...
- OSGi类加载流程
思路 OSGi每个模块都有自己独立的classpath.如何实现这一点呢?是因为OSGi采取了不同的类加载机制: OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内 ...
- 什么是HTML?HTML5是什么?HTML5有那些优势和特性?
一.什么是HTML 在了解html5之前,首先要说一下html语言,尽管是更新后的5,但很多的地方还是保留了html的优势. HTML是HyperText Markup Language超级文本标记语 ...
- Javascript高级编程学习笔记(92)—— Canvas(9) 渐变
渐变 渐变由 canvasGradient 实例表示 要创建一个渐变对象需要调用 createLinearGradient() 方法 该方法接收四个参数: 起点的x坐标 起点的y坐标 终点的x坐标 终 ...
- [Swift]LeetCode98. 验证二叉搜索树 | Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- 机器学习基石笔记:04 Feasibility of Learning
原文地址:https://www.jianshu.com/p/f2f4d509060e 机器学习是设计算法\(A\),在假设集合\(H\)里,根据给定数据集\(D\),选出与实际模式\(f\)最为相近 ...
- 【Storm篇】--Storm基础概念
一.前述 Storm是个实时的.分布式以及具备高容错的计算系统,Storm进程常驻内存 ,Storm数据不经过磁盘,在内存中处理. 二.相关概念 1.异步: 流式处理(异步)客户端提交数据进行结算,并 ...
- python3+ selenium3开发环境搭建-手把手教你安装python(详细)
环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...
- C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇
题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...
- Python的协程
什么是协程 协程又叫做微线程,它是在单一线程内通过不断切换执行的.协程的切换不是上下文的切换也就是说不是CPU的执行任务的切换,比如CPU执行一会线程1,然后再执行一会线程2,在多核CPU上,Pyth ...