时间:JAVA-Date-SimpleDateFormat-Calendar

2 篇文章 0 订阅

内容:

     一些符号

     时间转换成字符串

     字符串转换为时间

                      两个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值