内容:
一些符号
时间转换成字符串
字符串转换为时间
两个parse函数的使用。获取某个月,然后结合Calendar获得这个月的最后一天,或某一天,等等。。
符号:
G 纪元\年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12) A.M./P.M.
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第X个星期Y
w 一年中第几周
W 一月中第几周
a 上午 / 下午 标记符
k 时 一天中的小时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区
。。。一大一小
1:时间转换成字符串:
当前时间转换成字符串:很直观
结果:
代码:
public static void main(String[] args) throws ParseException {
Date date = new Date();
System.out.println("STD:" + date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sdf:" + sdf.format(date));
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("sdf2:" + sdf2.format(date));
SimpleDateFormat sdf3 = new SimpleDateFormat("MM月dd日 HH时mm分 yyyy年 ss秒");
System.out.println("sdf3:" + sdf3.format(date));
}
2:字符串转化为时间:
注意问题:字符串传为时间的字符需要包含模板的格式。也就是模板为’yyyy-MM‘ ,字符串中至少是‘年-月’,可以是‘年-月-日 。。。’.如果只有‘年’,将会是空值.SimpleDateFormat("yyyy-MM");那么source至少是"2019-05"这样的格式,也可以是"2019-05-20".但是解析后的是跟2019-05一样的。
//两个方法,两个参数的不常用。
Date java.text.SimpleDateFormat.parse(String source)
Date java.text.SimpleDateFormat.parse(String text, ParsePosition pos)
//由于第二个不常用,先说一下。看参数名字也很容易理解,
//一段text 和 解析位置 pos
1、Date java.text.SimpleDateFormat.parse(String text, ParsePosition pos)
SimpleDateFormat sdfp = new SimpleDateFormat("yyyy-MM");
String text="Time:2019-05";
System.out.println("sdfp:" + sdfp.parse(text,new ParsePosition(5) ));
结果:
sdfp:Wed May 01 00:00:00 CST 2019
2、Date java.text.SimpleDateFormat.parse(String source)
//代码
SimpleDateFormat sdfp = new SimpleDateFormat("yyyy-MM");
System.out.println("STD:" + sdfp.parse("2019-05"));
//结果:
STD:Wed May 01 00:00:00 CST 2019
根据获得到的年月来获取这个月的最后一天。形成一个月份的范围
SimpleDateFormat sdfp = new SimpleDateFormat("yyyy-MM");
Calendar cal = Calendar.getInstance();
Date ds = sdfp.parse("2019-05");
System.out.println("初始时间:" + ds);
cal.setTime(ds);
cal.setTime(ds);
cal.set(cal.DAY_OF_MONTH,cal.getMaximum(cal.DAY_OF_MONTH));
System.out.println("本月的最后一天:" + cal.getTime());
//结果
初始时间:Wed May 01 00:00:00 CST 2019
本月的最后一天:Fri May 31 00:00:00 CST 2019
以上就得到了5月1日 0点到5月31日 0点的范围。
不够完善,要得到起始和最终。
起始取范围取5月1至6月1之间就是想要的范围了。
但是,现在要取精确的值。所以,继续:
方法1:
直接设置最后一天的各项数据为最大,时分秒 毫秒。
Date ds = sdfp.parse("2019-05");
System.out.println("初始时间:" + ds);
cal.setTime(ds);
cal.set(cal.DAY_OF_MONTH,cal.getActualMaximum(cal.DAY_OF_MONTH));
cal.set(cal.HOUR_OF_DAY,cal.getActualMaximum(cal.HOUR_OF_DAY));
cal.set(cal.MINUTE,cal.getActualMaximum(cal.MINUTE));
cal.set(cal.SECOND,cal.getActualMaximum(cal.SECOND));
cal.set(cal.MILLISECOND,cal.getActualMaximum(cal.MILLISECOND));
System.out.println("本月的最后一天:" + cal.getTime());
结果
本月的最后一天:Fri May 31 23:59:59 CST 2019
方法2:
下个月的一号的零点减一毫秒就可以得到。
Calendar cal = Calendar.getInstance();
Date ds = sdfp.parse("2019-05");
System.out.println("初始时间:" + ds);
cal.setTime(ds);
cal.set(cal.DAY_OF_MONTH,cal.getActualMaximum(cal.DAY_OF_MONTH));
cal.set(cal.HOUR_OF_DAY,cal.getActualMaximum(cal.HOUR_OF_DAY));
cal.set(cal.MINUTE,cal.getActualMaximum(cal.MINUTE));
cal.set(cal.SECOND,cal.getActualMaximum(cal.SECOND));
cal.set(cal.MILLISECOND,cal.getActualMaximum(cal.MILLISECOND));
System.out.println("本月的最后一天:" + cal.getTime().getTime());
System.out.println("下个月的第一天:" + sdfp.parse("2019-06").getTime());
结果
本月的最后一天:1559318399999
下个月的第一天:1559318400000
从结果中可以看到只差了一毫秒哦。。。
所以代码改进:
//方式二
Calendar cal = Calendar.getInstance();
Date ds = sdfp.parse("2019-05");
System.out.println("初始时间:" + ds);
cal.setTime(ds);
cal.add(cal.MONTH, 1);//下个月
cal.add(cal.MILLISECOND, -1);//减去1毫秒
System.out.println("本月的最后一天:" + cal.getTimeInMillis());
结果:与上面的一致
本月的最后一天:1559318399999
这样就得到了一个范围。
更简单的:这个是个开区间。上个月的最后一秒到下个月的开始之间
代码:
SimpleDateFormat dts = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat std = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = "2019-05";
String startDate = null;
String endDate = null;
cal.setTime(dts.parse(date1));
cal.add(cal.MILLISECOND, -1);
startDate = std.format(cal.getTime());
cal.setTime(dts.parse(date1));
cal.add(cal.MONTH, 1);
endDate = std.format(cal.getTime());
System.out.println(startDate);
System.out.println(endDate);
结果:
2019-04-30 23:59:59
2019-06-01 00:00:00
本次使用到了相关的内容,所以记录了下来。
需要注意的是,获取最大值的时候要使用获取实际最大值的方法cal.getActualMaximum(field)
YQY
ABCDEFAG