zoukankan      html  css  js  c++  java
  • Java日期时间处理

    本文详细讲解了日期、时间的处理,非常实用。文章系转载,地址:http://www.cnblogs.com/hqr9313/archive/2012/04/19/2458221.html


    时间日期
    1)java中的时间类有:Date和Calendar
    2)java中时间类的本质 long(毫秒数)
      Date = long +历法算法(方法getYear())
      Calendar = long +历法算法(方法get())
    3) 时间的标准有两种
     (1970)GMT long
     (0)UTC long
    4) java中基本的时间表示GMT long
    5) java提供了Date类型表示时间和日期
       Date 是long 类型的包装
    6) Calendar 是历法的抽象
     历法:公历,农历,太阳历
    7) GregorianCalendar是历法的实现,采用公历的算法实现的
       Calendar cal = Calendar.getInstance();
       Calendar cal = new GregorianCalendar();//除了日本和泰国,效果等同于上一句
    8) Date和 Calendar的默认值就是系统当前时间


    一、 java中表示时间的方式:
    1) 格林威治时间(GMT):1970年1月1日 00:00:00(注:中国是东八区,所以要+8个小时)
      也就是1970年1月1日 08:00:00
    2 )公元元年(UTC): 0年
    3 )目前java中3种日期表达方式long, Date , Calendar都在用

    实例:

    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    public class LongDateDemo {
     public static void main(String[] args) {
      long now = System.currentTimeMillis();
      long year = now/1000/60/60/24/365 +1970;
      System.out.println(year);
      //一年 地球绕太阳一圈(365天+1/4天)
      //原点(公元元年)
      
      /* date.getYear()是将date内部的long时间,根据历法计算
       * 为年份,返回值是2位数年份,如:1997年返回97,但是过了
       * 2K年,返回3位数年份,如2012返回112
       */
      
      //老板本
      Date date = new Date();//默认是当前时间(long)
      int y = date.getYear()+1900;
      int month = date.getMonth()+1;
      System.out.println(y+"年"+month+"月");
      
      //新版本
      //Calendar 历法
      Calendar cal = new GregorianCalendar();//默认是当前时间(long)
      y = cal.get(Calendar.YEAR);//2012
      month = cal.get(Calendar.MONTH)+1;//4
      System.out.println(y+"年"+month+"月");
     }
    }

    二 时间类型转换  long <-> Date <-> Calendar
     long --->Date :  dat = new Date(l)
           dat.setTime(l)
     Date --->Calendar : cal.setTime(dat)
     Calendar ---> Date: cal.getTime()
     Date ---> long :dat.getTime()
     注:Date dat  ,  long l  ,Calendar cal
    例子

    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    /**
     * 时间的类型转换
     */
    public class DateCaseDemo {
     public static void main(String[] args) {
      long gmt = 0;//格林威治时间 1970/01/01
      Date date = new Date();
      date.setTime(gmt);//回到1970 元旦,相当于long -->Date
      System.out.println(date.getYear()+1900);//1970
      Calendar cal = new GregorianCalendar();
      //date --> cal
      cal.setTime(date);//将cal设置为date的时间,也是1970
      System.out.println(cal.get(Calendar.YEAR));//1970
      //date 和 cal ,gmt 代表同一时刻
      //加-1天,是在当前时间上加-1天,就是减少1天,就是减少1天的毫秒数(1000*60*60*24)
      cal.add(Calendar.DAY_OF_YEAR,-1);
      Date d = cal.getTime();
      System.out.println(d);//1969
      long l = d.getTime();
      System.out.println(l);//-86400000,因为是在原点以前的时间
     }
    }
    
    三 时间的输入与输出
    1)  日期输出的本质是将Date转换为格式化的String
    2)  日期输入的本质是将格式化的 String转换为 Date
    3)  SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       构建SimpleDateFormat 一般提供日期的格式"yyyy-MM-dd"具体参看javadoc
        如:"yyyy-MM-dd HH:mm:ss"
         "yyyyMMdd"
         "dd/MM/yy"
         "MM/dd/yyyy"
    常用方法
     fmt.parse(String)    可以实现将(合法)字符串解析为日期类型,经常用于处理日期输入
     fmt.format(Date)     可以把日期格式化为字符串用于输出处理

    使用字符串String输出时间
      Date ---> String:
      DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
      fmt.format(date)
    把字符串String时间转为Date时间(个是必须相同)
      String --> Date :
      DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
      fmt.parse("1999-2-2")
    注: java没有提供String直接转换为Calendar的API方法,但第三方提供的API有这种方法
     如果Calendar需要转为String,必须先转换为Date
     Calendar ----> Date : 
     Date dat = cal.getTime();

    示例:

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class DateIODemo {
     public static void main(String[] args) throws ParseException {
      Date date = new Date();//当前时间,当前毫秒数
      //输出yyyy-MM-dd HH:mm:ss
      SimpleDateFormat fmt = 
       new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      //将日期类型格式化为时间字符串
      String str = fmt.format(date);//日期格式化
      System.out.println(str);//2012-12-21 00:00:00
      //解析日期字符串为日期类型对象
      String day = "2012-12-21";
      SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
      Date d = f.parse(day);//将日期字符串解析为毫秒数
      long l = d.getTime();
      System.out.println(fmt.format(d));
      String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
      System.out.println(s);//2012-04-18
     }
    }


    四 时间的计算
     时间计算的问题
     1)   本质是时间毫秒数的计算
     2) 简单时间计算,直接计算毫秒数,如:3天以后,2小时等
     3) 复杂时间计算,利用Calender类提供的历法算法实现
    常用方法:
         add() set()
         Calendar 提供的方法本是上也是计算毫秒数

    /**
       例子1
    */
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    public class DateCalDemo {
     public static void main(String[] args) {
      //简单时间计算
      long l = System.currentTimeMillis();//当前时间
      l += 1000L*60*60*24*3;//3天以后
      SimpleDateFormat sdm = new SimpleDateFormat("yyyy-MM-dd");  
      String s = sdm.format(new Date(l));
      System.out.println(s);
      //复杂时间计算
      Calendar cal = new GregorianCalendar();
      cal.add(Calendar.YEAR, 2);//2年以后
      cal.set(Calendar.MONTH,Calendar.JANUARY);//设置月份为1月
      System.out.println(sdm.format(cal.getTime()));//2年以后的1月
     }
    }
    
    /**
       例子2
    */
    import java.util.Calendar;
    import java.util.Date;
    
    public class SpecialDateDemo {
     public static void main(String[] args) {
     }
     /**
      * 计算商品的促销日期special Date,规则:商品过期前两周五促销 
      * @param creat
      * @param months
      * @return
      */
     public static Date special(Date creat,int months){
      Calendar cal = Calendar.getInstance();
      cal.setTime(creat); //生产日期
      cal.add(Calendar.MONTH, months);  //过期日
      cal.add(Calendar.WEEK_OF_YEAR, -2);  //回调2周
      if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){//如果是星期天
       cal.add(Calendar.WEEK_OF_YEAR, -1);//回调一周
       cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);//调到本周的周五
      }
      return cal.getTime();
     }
    }


  • 相关阅读:
    C# windows store socket:unknown system invalid operation exception 在意外的时间
    (转)回调函数
    VIM 安装taglist
    linux 修改时区
    SpringBoot专栏(二) -- 搭建第一个SpringBoot项目
    Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
    SpringBoot专栏(一) -- SpringBoot简介
    16.查询范围
    8-数据库操作
    5.请求和响应
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330040.html
Copyright © 2011-2022 走看看