java里的日期时间
为了更好理解java的日期时间类,在这里我们先介绍一下关于历法、标准时间的一些概念。
历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏历。注意,这个“夏历”的“夏”和“夏令时间”的“夏”不是一个含义。“夏历”的“夏”是夏朝的“夏”,因为据说我们现在使用的这套农历在我国上古时期的夏朝时就已经发展得很完备了。
当然了,不只是中国有自己的历法,很多民族很多古文明国家都有过自己的历法。比如,格里高里历,它其实就是我们生活中使用和称作阳历或公历的这套历法。格里高利历是公历的标准名称,是一种源自于西方社会的历法。它先由意大利阿洛伊修斯·里利乌斯(约1519-1576)与克拉乌等学者在儒略历的基础上加以改革,后由教皇格里高利十三世于1582年颁布。我国是在辛亥革命后根据临时政府通电,从1912年1月1日正式使用格里高利历的。1949年9月27日,经中国人民政治协商会议第一届全体会议通过,中华人民共和国使用国际社会多数国家通用的西历和西元作为历法和纪年。
标准时间(Standard Time)有世界标准时间(World Standard Time,WST)和中国标准时间(China Standard Time,CST)。中国标准时间就是我们经常提到的北京时间,北京时间采用东八时区的区时作为标准时间。而世界标准时间即格林威治时间(GreenwichMeanTime,GMT),指位于英国伦敦郊区的皇家格林尼治天文台(1675年,当时,英国的航海事业发展很快,为了解决在海上测定经度的需要,英国当局在伦敦东南郊距市中心约20多千米,泰晤士河畔的皇家格林尼治花园中建立了这个天文台)的标准时间,本初子午线就被定义在那里,格林尼治标准时间的正午是指当太阳横穿格林尼治本初子午线时的时间。北京时间(中国标准时间)和格林威治时间(世界标准时间)相差整整八小时,即北京时间=格林威治时间+8小时。北京时间,东京时间,纽约时间这些标准时间都是在格林威治时间的基础上计算得来的。
java类库里有一个GregorianCalendar类,就是我们的格里高利历法类,它用这个类代表或者说包装了格里高利历法。因为GregorianCalendar这个类还和上面提到的儒略历也有关系,所以接下来我们把格里高利历和儒略历的关系也简单介绍一下。
儒略历是格里高利历(公历)的前身,于公元前46年,由当时的罗马统帅儒略·恺撒在天文学家索西琴尼的帮助下制订并执行。儒略历以回归年为基本单位,是一部纯粹的阳历,它比回归年365.2422日长0.0078日,400年要多出3.12日。1500年后由于误差较大,被罗马教皇格里高利十三世于1582年进行改善与修订,变为格里历,即沿用至今的世界通用的公历。格里高利历的历年平均长度为365日5时49分12秒,比回归年长26秒,虽然照此计算,3000年后仍存在1天的误差,但这样的精确度已经相当了不起了。由于它内容简洁,而且精度较高,因此它逐步为各国政府所采用。
注意:格里高利历1582年10月4日之前,应用的是儒略历。
1582年3月1日,格里高利颁发了改历命令,内容是:
一、1582年10月4日后的一天是10月15日,而不是10月5日,但星期序号仍然连续计算,10月4日是星期四,第二天10月15日是星期五。这样,就把1500年以来积累的老账一笔勾销了。
二、改闰年方法为: 凡公元年数能被4整除的是闰年,但当公元年数后边是带两个“0”的“世纪年”时,必须能被400整除的年才是闰年。
进入主题!!!
java里有一个Calendar抽象类(历法抽象类),其常用的实现类为GregorianCalendar类(格里高利历法类)。
注意java里的GregorianCalendar类在1582年10月4日之前,应用的也是儒略历。我们可以通过代码运用反证法来验证,我们知道,在格里高利历和儒略历的体系里是没有1582年10月5日、6日、7日这几个日期的,那我们就故意给java的GregorianCalendar类的对象赋值为1582年10月7日,看看它运行的结果到底是什么样子的?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JulianCalendar {
public static void main(String[] args) throws ParseException {
String str = "1582-10-07 00:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
}
验证儒略历代码示例
Sun Oct 17 00:00:00 CST 1582
运行结果
从上面的代码运行结果看,我们肯定地得出结论,java的GregorianCalendar类包装的是格里高利历法和儒略历法。
如果我们想要实例化Calendar类,可以调用其静态方法getInstance(),该方法会根据当前系统所在地区返回一个实现类,大部分地区都是公历,即GregorianCalendar类。并且这个GregorianCalendar实现类默认表示当前系统时间,也就是windows操作系统桌面右下角的时间,对于我们来说就是阳历北京时间某年某月某日某时某分某秒……
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
}
}
示例代码
java.util.GregorianCalendar[time=1490616294512,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_YEAR=86,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=4,SECOND=54,MILLISECOND=512,ZONE_OFFSET=28800000,DST_OFFSET=0]
运行结果
我们看到Calendar类的toString()方法包含的内容很多,但可读性不强。
所以这个时候我们需要用到Calendar类的另外一个方法,getTime()方法,这个方法返回的是一个Date类的对象。
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(date);
}
}
示例代码
Mon Mar 27 19:38:40 CST 2017
运行结果
这个格式好多了,但它也不是我们大多数时候习惯的格式。
这时可以使用JDK里的另外一个类SimpleDateFormat,该类可以按照一个指定的自定义日期格式将Date与String之间进行相互转换,通过它我们可以得到想要的任何格式的日期表现形式。
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);
System.out.println(str);
}
}
示例代码
2017-03-27 20:19:15
运行结果
java里的日期时间的更多相关文章
- Java 8 新日期时间 API
Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...
- 使用Java编写一个日期时间封装类
package base; import java.util.GregorianCalendar; import java.util.StringTokenizer; import java.util ...
- Java里的日期和时间学习
Date date = new Date();//yyyy-mm-dd hh:mm:ss[.fffffffff] SimpleDateFormat sdf = new SimpleDateFormat ...
- java创建Date日期时间笔记
(1)public Date() 创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间. 例: Java代码 1.Date today=new Date(); //today被设置成创建时刻相 ...
- java android中日期时间 问题总结
Date 类型: Date date = new Date(); // 代表获取当前系统日期和时间 System.out.println(date); 使用类的方法设置时间和日期:(通过该方法初始 ...
- java基础之日期时间工具类
package zy.test; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParseP ...
- 在java中进行日期时间比较的4种方法
1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后, ...
- java设定一个日期时间,加几分钟(小时或者天)后得到新的日期
//返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...
- Java获取系统日期时间
方法一:利用Calendar类来获取当前日期和时间,代码如下: /** * 获取系统时间 * @return */ public String getDate(){ Calendar calendar ...
随机推荐
- block之---内存管理
首先简单说下MRC和ARC MRC: 手动管理内存,需要自己去释放内存, 如果对象的引用计数器为0时对象就会被释放. 属性修饰策略:assign, retain, copy ARC: ARC是编译器特 ...
- block之--- 基本使用
block的类型:对象 官方文档描述如下 “Blocks are Objective-C objects, which means they can be added to collections l ...
- java类初始化,使用构造方法
public class test { /** * java类的初步学习: * 学会使用和类名相同的两种构造方法,对公共类方法的调用: */ public static void main(Str ...
- 用jdk在cmd下运行编译java程序
1.首先通过创建一个txt文档,将java代码写入txt文档中保存 2.将保存好的HelloWorld.txt文档重命名为HelloWorld.java文件. 3.打开windows中的"命 ...
- 华为荣耀畅玩5C NEM-UL10 ROOT那些事儿(亲测成功)
以前ROOT手机都是在手机上安装KingRoot 刷机精灵等软件分分钟成功(不排除偶然,,比如这款华为荣耀...) 手机安装KingRoot等软件,,,失败 电脑上安装连接手机Root,,,,失败 ...
- Git建空白分支
先执行以下命令从当前分支建一个分支,NEWBRANCH为新分支名字. git checkout --orphan NEWBRANCH 执行上面命令后,会切换到新分支.再执行命令下面命令,清空该分支(注 ...
- Hadoop学习笔记:使用Mrjob框架编写MapReduce
1.mrjob介绍 一个通过mapreduce编程接口(streamming)扩展出来的Python编程框架. 2.安装方法 pip install mrjob,略.初学,叙述的可能不是很细致,可以加 ...
- 如何利用docker快速构建MySQL主从复制环境
在学习MySQL的过程中,常常会测试各种参数的作用.这时候,就需要快速构建出MySQL实例,甚至主从. 考虑如下场景: 譬如我想测试mysqldump在指定--single-transaction参数 ...
- Ant 警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除
如果你用Ant编译项目,而且在项目中用了SUN的专用API,你会得到警告信息,然后Ant会报告编译失败: 这当然是不合理的,javac只是警告而已,ant凭什么就直接报失败呢? 其实最好的解决办法是避 ...
- Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写
"./drivers/i2c/busses/i2c-s3c2410.c"是3.14.0内核中三星SoC的i2c控制器驱动程序, 本文试图通过对这个程序的分析, 剥离繁复的细节, 总 ...