时间

来源:互联网 发布:哈药扫码的软件 编辑:程序博客网 时间:2024/06/10 04:02

概述

java.util.date      传输java.util.Calendar    时间偏移,设定

Date

Calendar

Calendar获取的时间就是公历时间

转换 Date :

Calendar calendar = Calendar.getInstance();  calendar.setTime(date);  Date date = calendar.getTime();  

set()

set(int field, int value)     - 是用来设置"年/月/日/小时/分钟/秒/微秒"等值  
@Testpublic void specified(){    Calendar cal = Calendar.getInstance();    Date date = new Date();    cal.setTime(date);    cal.set(Calendar.DAY_OF_MONTH,1);    cal.set(Calendar.HOUR_OF_DAY,0);    cal.set(Calendar.MINUTE,0);    cal.set(Calendar.SECOND,0);    cal.set(Calendar.MILLISECOND,0);    System.out.println(date);    System.out.println(cal.getTime());//      Wed Sep 06 21:16:24 CST 2017//      Fri Sep 01 00:00:00 CST 2017     这个月的开始}

注意

1.月份的起始值为0而不是1。 2.在方法set(int year, int month, int day, int hour, int minute, int second) 中不会自动将 MilliSecond 清为 0。  3.时间越界处理方式    @Test    public void specified3(){        Calendar cal1 = Calendar.getInstance();         cal1.set(2000, 8, 31, 0, 0 , 0);    //2000-9-31         System.out.println(cal1.getTime()); //输出的是2000-10-1    }4.set() 方法采取延缓计算的方法。    Calendar cal1 = Calendar.getInstance();      cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31      cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1      cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30      System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录      在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新3. 不稳定的 Calendar      我们知道 Calendar 是可以被 serialize 的,但是我们要注意下面的问题      import java.io.*;      import java.util.*;      public class UnstableCalendar implements Serializable      {      public static void main(String[] args) throws Exception{      Calendar cal1 = Calendar.getInstance();      cal1.set(2000, 7, 1, 0, 0 , 0);      cal1.set(Calendar.MILLISECOND, 0);      ObjectOutputStream out =      new ObjectOutputStream(      new FileOutputStream("newCalendar.out"t);      out.writeObject(cal1);      out.close();      ObjectInputStream in =      new ObjectInputStream(      new FileInputStream("newCalendar.out"t);      Calendar cal2 = (Calendar)in.readObject();      cal2.set(Calendar.MILLISECOND, 0);      System.out.println(cal2.getTime());      }      }      运行的结果竟然是: Thu Jan 01 00:00:00 PST 1970      它被复原到 EPOC 的起始点,我们称该 Calendar 是处于不稳定状态。这个问题的根本原因是 Java 在 serialize GregorianCalendar 时没有保存所有的信息,所以当它被恢复到内存中,又缺少足够的信息时,Calendar 会被恢复到 EPOCH 的起始值。Calendar 对象由两部分构成:字段和相对于 EPOC 的微秒时间差。字段信息是由微秒时间差计算出的,而 set() 方法不会强制 Calendar 重新计算字段。这样字段值就不对了。      下面的代码可以解决这个问题:      import java.io.*;      import java.util.*;      public class StableCalendar implements Serializable      {      public static void main(String[] args) throws Exception{      Calendar cal1 = Calendar.getInstance();      cal1.set(2000, 7, 1, 0, 0 , 0);      cal1.set(Calendar.MILLISECOND, 0);      ObjectOutputStream out =      new ObjectOutputStream(      new FileOutputStream("newCalendar.out"t);      out.writeObject(cal1);      out.close();      ObjectInputStream in =      new ObjectInputStream(      new FileInputStream("newCalendar.out"t);      Calendar cal2 = (Calendar)in.readObject();      cal2.get(Calendar.MILLISECOND); //先调用 get(),强制 Calendar 刷新      cal2.set(Calendar.MILLISECOND, 0);//再设值      System.out.println(cal2.getTime());      }      }      运行的结果是: Tue Aug 01 00:00:00 PDT 2000  

add()

add()可以对指定时间偏移
@Testpublic void add(){    Calendar cal1 = Calendar.getInstance();      cal1.add(Calendar.DAY_OF_YEAR, -1);     cal1.add(Calendar.HOUR_OF_DAY, -1);     System.out.println(new Date());     //结果是 Wed Sep 06 21:29:19 CST 2017    System.out.println(cal1.getTime()); //结果是 Tue Sep 05 20:29:19 CST 2017                                        //天数和小时都向前移动了}
当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正
@Testpublic void add1(){    Calendar cal1 = Calendar.getInstance();      cal1.set(2000, 7, 31, 0, 0 , 0);    //2000-8-31      cal1.add(Calendar.MONTH, 1);        //2000-9-31 => 2000-10-1或者10月31日,对吗?      System.out.println(cal1.getTime()); //结果是 2000-9-30  }

apache lang3 DateUtils

设置

 public static Date setDays(final Date date, final int amount) public static Date setHours(final Date date, final int amount)

偏移

public static Date addYears(final Date date, final int amount)public static Date addMonths(final Date date, final int amount)

装换

public static Date parseDate(final String str, final String... parsePatterns)

SimpleDateFormat

@Testpublic void format() throws ParseException{    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");    System.out.println(sdf.format(new Date()));  //2017-09-06 22:21:26:472    Date date = sdf.parse("2017-09-06 22:21:26:472");}

参考

http://blog.csdn.net/fantasiasango/article/details/52603170

原创粉丝点击