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();
 }
}


相关文章
|
4月前
|
Java
Java基础之日期和时间
Java基础之日期和时间
35 1
|
5月前
|
安全 Java 程序员
Java8实战-新的日期和时间API
Java8实战-新的日期和时间API
44 3
|
1月前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
35 14
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
49 3
|
2月前
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
3月前
|
前端开发 JavaScript Java
【前端学java】java中的日期操作(13)
【8月更文挑战第10天】java中的日期操作
23 2
【前端学java】java中的日期操作(13)
|
3月前
|
Java
比较两个日期是否相等Java
这篇文章提供了Java中比较两个日期是否相等的两种方法:使用`Calendar`类和`SimpleDateFormat`类来确定两个日期是否为同一天,并附有详细的代码示例和测试结果。
|
5月前
|
Java 测试技术 API
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
【6月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
46 3
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
|
4月前
|
安全 Java API
Java基础之日期和时间
【7月更文挑战第3天】 Java 8之前的日期时间处理涉及Date、Calendar、SimpleDateFormat及TimeZone类。Date是不可变对象,但不推荐直接调整时间。Calendar提供日期计算,而SimpleDateFormat用于格式化。Date和Calendar非线程安全,处理时区需用TimeZone。Java 8引入了java.time包,包含Instant、LocalDate等类,提供更现代、线程安全和高效的API,例如Instant用于时间戳,LocalDateTime表示日期和时间,ZonedDateTime处理时区。下节将探讨Java 8的新API。
103 2
|
4月前
|
Java API
Java基础之日期和时间
【7月更文挑战第4天】 Java日期时间API概览:Java 8之前,Date表示不可变时间点,Calendar用于计算,SimpleDateFormat处理格式化。Date的setXXX方法不推荐,Calendar支持加减操作。时区处理用TimeZone,Time仅处理时间(不含日期)。Java 8引入java.time包,提供Instant、LocalDate等线程安全类,改进了性能和易用性,支持时区和更复杂操作。后续将探讨Java 8的新特性!
45 1