• 每日一问(时间相关的类有哪些常用的?如何进行计算和输出)


    日常中最常用的表示时间的类就是java.util.Date类了,实际上Date类还有

    • java.sql.Date,
    • java.sql.Date类是对java.util.Date类的继承。从包名上也可以看出
    • java.sql.Date类是处理SQL时使用的类

    通过查看java.sql.Date类,可以看到其主要的方法及接口均继承自java.util.Date类,例如以下创建方法

    public Date(long date) {
            // If the millisecond date value contains time info, mask it out.
            super(date);
    
        }

    它自己实现的接口主要为valueOf(String)和toString()方法,从这两个方法可以看出java.sql.Date在与字符串与日期转换的时候,只能够支持年/月/日的输入和输出。当然如果是通过其父类的方法进行创建的,例如通过long类型入参进行创建的实例中,仍然包含时间的信息。

    对于java.util.Date类实例的操作,常用的可能有三类

    1.创建日期实例

    创建日期的方法为Date(long date),该方法将date参数传递给实例的一个long类型参数中,也就是说实际上Date类型依然是以数字的方式保持时间信息。再通过其它的接口来将其转化为我们所需要的时间信息。注意这个long参数为transient类型,这导致Date类型实例保存的时间信息无法进行序列化。

    为了获取到当前的日期,可以使用Date()方法创建,该方法实际返回为将System.currentTimeMillis()作为参数调用上面提到的Date(long date)方法。

    实际上,我们无法从Date实例中的long类型值直接知道当前的时间値,当然也就无法通过long值设置时间。我们常用SimpleDateFormat类来创建Date类型的时间,该类通过某种格式的字符串来创建Date实例

         DateFormat formate = new SimpleDateFormat("yyyy-MM-dd");
            try {
                Date newDate = formate.parse("2014-01-12");
                System.out.println(formate.format(newDate));
                System.out.println(newDate);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    输出为: 

    2014-01-12
    Sun Jan 12 00:00:00 CST 2014

    实际上也可通过Calendar类来设置时间

            SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, 2000);
            cal.set(Calendar.MONTH, 3);
            cal.set(Calendar.DATE, 29);
            cal.set(Calendar.HOUR, 10);
            cal.set(Calendar.MINUTE, 12);
            cal.set(Calendar.SECOND, 15);
            Date date = cal.getTime();
            
            System.out.println(formate.format(date));

    这里需要注意的是,设置月份是,是从0开始的,也就是说当传递0时,表示为1月,依次类推。输出为

    2000-04-29 10:12:15

     2.设置和获取具体的时间值,例如年月日等信息

    java.util.Date类中的日期获取方法例如getYear()和setYear(int)等,均为@Deprecated,即已被舍弃,实际上如果通过main函数直接调用并将这些方法的结果输出,也可能无法直接得到我们希望的结果。

    例如在上述代码中加入System.out.println(newDate.getYear());语句,其输出为:114

    实际上,调用setYear(int)时,有一个“+ 1900”的计算,getYear()则有一个“- 1900”这导致如果在设置时间值时,需要进行修正,例如需要设置年份为2000--03-03时有:

            SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                
            Date date = new Date();
            date.setYear(100);
            date.setMonth(3);
            date.setDate(3);
            
            System.out.println(formate.format(date));
            System.out.println(date.getYear());

    此时输出值为:

    2000-04-03 01:44:04
    100

    3.进行时间的推算

    可通过计算直接对Date类型实例进行计算,例如需要推算出当前时间一个小时后的时间时,有

            SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date nowDate = new Date();
            Date newDate = new Date(nowDate.getTime()+1*24*60*60*1000);
            System.out.println("          now:"+formate.format(nowDate));
            System.out.println("one day later:"+formate.format(newDate));

    输出可能为

              now:2014-02-26 01:12:18
    one day later:2014-02-27 01:12:18

    在实际上使用中,用于时间的计算,更多的是java.util.Calendar,例如

            SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date nowDate = new Date();
            
            Calendar cal = Calendar.getInstance();
            cal.setTime(nowDate);
            cal.add(Calendar.DATE, 1);
            Date newDate = cal.getTime();
            
            System.out.println("          now:"+formate.format(nowDate));
            System.out.println("one day later:"+formate.format(newDate));

     输出结果与上面的例子是一样的。

  • 相关阅读:
    【VS开发】CListCtrl控件使用方法总结
    【VS开发】CListCtrl控件使用方法总结
    【VS开发】CTabView多页卡界面
    【VS开发】CTabView多页卡界面
    【VS开发】关于在CFormView中实现CListCtrl控件的注意事项
    【VS开发】关于在CFormView中实现CListCtrl控件的注意事项
    【VS开发】list控件的InsertColumn方法出错
    【VS开发】list控件的InsertColumn方法出错
    【VS开发】CListCtrl控件使用
    【VS开发】CListCtrl控件使用
  • 原文地址:https://www.cnblogs.com/oldfish/p/3568194.html
Copyright © 2020-2023  润新知