【编程规约】日期时间

 
愿你如阳光,明媚不忧伤。

 


1. Java 中的日期时间

 

java.util.Date 是 java.sqlDate,Time,Timestamp 的父类,提供了两个构造函数来实例化 Date 对象。但Date的设计具有"千年虫"以及"时区"的问题,建议使用Calendar类来操作时间。

  • 第一个构造函数使用当前日期和时间来初始化对象。
    Date( );
  • 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
    Date(long millisec)

* 在Java中输出java new Date(0)输出的是:Thu Jan 01 08:00:00 CST 1970,这是因为时区的概念,中国是东八区,所以对应的是早上八点

  • Date 对象函数
返回值函数描述
booleanafter(Date date)Date对象在指定日期之后返回true,否则返回false
booleanbefore(Date date)Date对象在指定日期之前返回true,否则返回false
intcompareTo(Date date)与指定日期进行比较,两者相等返回0,之前返回负数,之后返回正数
longgetTime( )返回自1970年1月1日 00:00:00 GMT 以来的毫秒数
voidsetTime(long time)用自1970年1月1日00:00:00 GMT以后的毫秒数设置时间和日期
StringtoString( )转换为:dow mon dd hh:mm:ss zzz yyyy 格式输出

 

  • java.util.Calendar 日历函数(部分)
    Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可,其日历字段已由当前日期和时间初始化。
返回值函数描述
CalendargetInstance( [ TimeZone zone , Locale aLocale ] )返回基于当前时区和区域设置的日历
voidadd(int field, int amount)基于日历的规则实现日期加减
booleanafter(Object when)判断是否在另一个日期对象表示的时间之后
booleanbefore(Object when)判断是否在另一个日期对象表示的时间之前
voidclear( [ int field ] )将日历字段的值和时间值设置为初始状态
Objectclone()创建并返回该对象的副本
intcompareTo(Calendar anotherCalendar)与指定日期进行比较,两者相等返回0,之前返回负数,之后返回正数
intget(int field)返回指定日历字段的值
intgetMaximum(int field)返回指定日历字段的理论最大值
intgetMinimum(int field)返回指定日历字段的理论最小值
intgetActualMaximum(int field)返回指定日历字段的实际最大值
intgetActualMinimum(int field)返回指定日历字段的实际最小值
DategetTime()返回当前日期
voidset(int field)设置日历字段的值
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
System.out.println(sdf.format(date));// 2020-12-31 20:08:05
int a = 5;
System.out.println(calendar.get(a));// 31
calendar.clear();
System.out.println(calendar.get(a));// 1

 

  • java.util.Calendar 中的静态常量(日历字段)
     
静态常量数字描述范围
ERA0纪元0 - 1
YEAR11 - 292278994
MONTH2月份0 - 11
WEEK_OF_YEAR3当年第几周1-53
WEEK_OF_MONTH4当月第几周0 - 6
DATE5日期1 - 31
DAY_OF_MONTH5当月第几天(同 DATE)1 - 31
DAY_OF_YEAR6当年第几天1 - 366
DAY_OF_WEEK17当周第几天1 - 7
DAY_OF_WEEK_IN_MONTH8当月第几周1 - 6
AM_PM9上午 / 下午0 - 1
HOUR10小时0 - 11
HOUR_OF_DAY11一天中的第几小时0 - 23
MINUTE120 - 59
SECOND130 - 59
MILLISECOND14毫秒0 - 999
ZONE_OFFSET15毫秒为单位指示距 GMT 的大致偏移量-46800000 - 50400000
DST_OFFSET16毫秒为单位指示夏令时的偏移量0 - 7200000
FIELD_COUNT17字段值总数0 - 16
  • java.text.DateFormat 格式化日期抽象类
    DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。

 

  • java.text.SimpleDateFormat 格式化日期
    SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类,常用格式:“yyyy-MM-dd hh:mm:ss”
 Date date = new Date();
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 System.out.println(sdf.format(date));
 // 2020-12-24 01:24:59
字母描述
aA.M./P.M. 标记
DDD一年中的日子
dd一月中的日子
E星期几
F一个月中第几周的周几
G纪元标记(AD)
HH二位数表示小时 24进制(0-23)
hh二位数表示小时 12进制(1-12)
KA.M./P.M. (0~11)格式小时
k一天中的小时(1~24)
MM月份
mm分钟
ss秒数
sss毫秒数
W一月中的第几周
w一年中的第几周
yyyy四位年份
z时区

 

  • printf 格式化日期
    自带格式:使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾
    自定义格式:用一个格式化字符串指出要被格式化的参数的索引,索引必须紧跟在%后面,而且必须以$结束
转换符说明示例
c包括全部日期和时间信息星期六 十月 27 14:21:20 CST 2007
F"年-月-日"格式2020-12-24
D"月/日/年"格式12/24/20
r"HH:MM:SS PM"格式(12时制)02:25:51 下午
T"HH:MM:SS"格式(24时制)13:24:59
R"HH:MM"格式(24时制)13:24
A星期几的全称木曜日
a星期几的简称
B月份的全称12月
b月份的简称12月
C年的前两位20
y年的后两位20
j一年中的第几天359
m两位数字的月份(补0)12
d两位数字的天数(补0)24
e数字的天数(一位不补0)24
s输出字符串Due date:
S将字符串以大写形式输出DUE DATE:
n表示换行-
 Date date = new Date();
 System.out.printf("全部日期和时间信息:%tc%n", date);
 // 全部日期和时间信息:木 12月 24 14:01:39 CST 2020
 System.out.printf("%1$S %2$tB %2$td, %2$tY" , "Due date:", date);
 // DUE DATE: 12月 24, 2020

 


2. MySQL 中的日期时间

 

  • time 数据类型
    小时部分大于24的原因是 TIME 类型不仅可以用于表示一天的时间(小于24),还可以表示某个事件过去的时间或两个事件之间的时间间隔(最大间隔35天)
  • year 数据类型
    能够在1个字节内保存0年以及1901~2155年,并能使用两位或四位数字显示它们。所有的两位数字年份均被视为介于1970~2069年之间,这意味着,如果你在YEAR列中保存了01,MySQL服务器会将其当作2001年
数据类型格式范围起范围止
dateYYYY-MM-DD1000-01-019999-12-3
datetimeYYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:59
timeHH:MM:SS-838:59:59838:59:59
timestampYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00UTC2038-01-19 03:14:07UTC
yearYYYY19012155

 

  • Date 日期函数
函数说明示例
NOW()返回语句开始执行的日期和时间2021-01-05 18:57:23
SYSDATE()返回当前动态的实时日期和时间2021-01-05 18:57:23
CURDATE()返回当前的日期2021-01-05
CURTIME()返回当前的时间18:57:23
DATE(date)提取日期或日期/时间表达式的日期部分2021-01-05
EXTRACT(unit FROM date)返回日期/时间的单独部分unit_value
DATE_ADD(date,INTERVAL expr type)向日期添加指定的时间间隔2021-01-06 18:57:23
DATE_SUB(date,INTERVAL expr type)从日期减去指定的时间间隔2021-01-04 18:57:23
DATEDIFF(date1,date2)返回两个日期之间的天数30
DATE_FORMAT(date,format)用不同的格式显示日期/时间Jan 01 2021 18:57 PM

在这里插入图片描述

 


3. Oracle 中的日期时间

 

数据类型格式范围起范围止
dateYYYY-MM-DD1000-01-019999-12-3
INTERVAL DAY TO SECOND2+/-DDD HH:MM:SS.ssss--
INTERVAL YEAR TO MONTH3+/-YY-MM--
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00UTC2038-01-19 03:14:07UTC
TIMESTAMP WITH LOCAL TIME ZONE4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00UTC2038-01-19 03:14:07UTC
TIMESTAMP WITH TIME ZONEYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00UTC2038-01-19 03:14:07UTC
*****************************************************************	
时间间隔字面量		说明
----------------------------------------------------------------
INTERVAL '3' DAY	时间间隔为3INTERVAL '2' HOUR	时间间隔为2小时
INTERVAL '25' MINUTE	时间间隔为25分钟
INTERVAL '45' SECOND	时间间隔为45INTERVAL '3 2' DAY TO HOUR	时间间隔为3天零2小时
INTERVAL '3 2:25' DAY TO MINUTE	 时间间隔为3天零2小时25INTERVAL '3 2:25:45' DAY TO SECOND	时间间隔为3天零2小时2545INTERVAL '123 2:25:45.12' DAY(3) TO SECOND(2)	时间间隔为123天零2小时2545.12秒; 天的精度是3位数字,秒的小数部分的精度是2位数字
INTERVAL '3 2:00:45' DAY TO SECOND	时间间隔为32小时045INTERVAL '-3 2:25:45' DAY TO SECOND	时间间隔为负数,值为3天零2小时2545INTERVAL '1234 2:25:45' DAY(3) TO SECOND	时间间隔无效,因为天的位数超过了指定的精度3
INTERVAL '123 2:25:45.123' DAY TO SECOND(2)	时间间隔无效,因为秒的小数部分的位数超过了指定的精度2
.................................................................
INTERVAL '123' YEAR(3)	时间间隔为123年【默认精度为2INTERVAL '300' MONTH(3)	时间间隔为300INTERVAL '123-2' YEAR(3) TO MONTH	时间间隔为1232个月【
*****************************************************************	

 

  • 日期格式化参数
项目参数含义
yeary年的最后一位
yy年的最后二位
yyy年的最后三位
yyyy四位数表示年
monthmm二位数字表示月
mon简写形式 eg: 12月/dec
month全称形式 eg: 12月/december
daydd当月第几天
ddd当年第几天
dy当周第几天,简写形式 eg: 水/wed
day当周第几天,全称形式 eg: 水曜日/wednesday
hourhh二位数表示小时 12进制
hh24二位数表示小时 24小时
minutemi二位数表示分钟
secondss二位数表示秒 60进制
seasonq一位数 表示季度 (1-4)
weekw当月第几周
ww当年第几周
select to_char(sysdate,'y-yy-yyy-yyyy-mon-dd-ddd-dy-day-hh24-mi-ss-q-w-ww') from dual;

在这里插入图片描述
 

  • 日期函数
函数实例含义
ADD_MONTHS(d,int)add_months(sysdate,12)将给定的日期增加月份
LAST_DAY(d)last_day(sysdate)返回指定月份的最后一天
MONTHS_BETWEEN(d1,d2)months_between(sysdate,to_date(‘2020/12/31’,‘yyyy/mm/dd’))返回两个日期之间的月份
NEW_TIME(d,tz1,tz2)new_time(sysdate,‘PDT’,‘GMT’)tz1的日期和时间是d时,返回时区tz2中的日期和时间
NEXT_DAY(d,string)next_day(‘17-9月-2012’,‘星期六’)计算在日期d后满足由string给出的条件的第一天
ROUND(d[,format])round(sysdate,‘yyyy-MM-DD’)将日期d按照由format指定的格式进行处理.如果没有给format则使用缺省设置’DD’
TRUNC(d,format)trunc(sysdate,‘mi’)计算截尾到由format指定单位的日期d,缺省参数同ROUNG

 


4. 格林威治时间

GMT(Greenwich Mean Time)格林威治平时又称格林威治时间。它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天文观测,选择了穿过英国伦敦格林威治天文台子午仪中心的一条经线作为零度参考线,这条线,简称格林威治子午线。1884年10月在美国华盛顿召开了一个国际子午线会议,该会议将格林威治子午线设定为本初子午线,并将格林威治平时作为世界时间标准。由此也确定了全球24小时自然时区的划分,所有时区都以和 GMT 之间的偏移量做为参考。1972年之前,格林威治时间一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。

 


5. 世界标准时间

UTC(Coodinated Universal Time)协调世界时又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。UTC 是现在全球通用的时间标准,全球各地都同意将各自的时间进行同步协调。UTC 时间是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以秒为单位的国际原子时综合精算而成。在军事中,协调世界时会使用“Z”来表示。又由于Z在无线电联络中使用“Zulu”作代称,协调世界时也会被称为"Zulu time"。

  • UTC 由两部分构成:
  1. 原子时间(TAI, International Atomic Time):
    结合了全球400个所有的原子钟而得到的时间,它决定了我们每个人的钟表中,时间流动的速度。
  2. 世界时间(UT, Universal Time):
    也称天文时间,或太阳时,他的依据是地球的自转,我们用它来确定多少原子时,对应于一个地球日的时间长度。

 


6. 时区

时区(Time Zone)随着火车铁路与其他交通和通讯工具的发展,以及全球化贸易的推动,各地使用各自的当地太阳时间带来了时间不统一的问题,在19世纪催生了统一时间标准的需求,时区由此诞生。从格林威治本初子午线起,经度每向东或者向西间隔15°,就划分一个时区,在这个区域内,大家使用同样的标准时间。全球共分为24个标准时区,相邻时区的时间相差一个小时。但实际上,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。所以时区并不严格按南北直线来划分,而是按自然条件来划分。另外:由于目前,国际上并没有一个批准各国更改时区的机构。一些国家会由于特定原因改变自己的时区。

 


7. 夏令时

DST(Daylight Saving Time)夏令时又称夏季时间,或者夏时制。它是为节约能源人为规定地方时间的制度。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。全球约40%的国家在夏季使用夏令时,其他国家则全年只使用标准时间。标准时间在有的国家也因此被相应地称为冬季时间。在施行夏令时的国家,一年里面有一天只有23小时(夏令时开始那一天),有一天有25小时(夏令时结束那一天),其他时间每天都是24小时。

 


8. 本地时间

Native Time 在日常生活中所使用的时间我们通常称之为本地时间。这个时间等于我们所在(或者所使用)时区内的当地时间,它由与世界标准时间(UTC)之间的偏移量来定义。这个偏移量可以表示为 UTC-UTC+,后面接上偏移的小时和分钟数

 


【每日一面】

如何避免在公历闰年时出现日期转换错误或程序逻辑错误

使用 lengthOfYear() 函数来判断当年有多少天

// 获取今年的天数
int daysOfThisYear = LocalDate.now().lengthOfYear();
// 获取指定某年的天数
int daysOfAppointYear = LocalDate.of(2020, 2, 25).lengthOfYear();

  1. 周日为第一天,以此类推 ↩︎

  2. 需要向数据库提供一个 INTERVAL DAY TO SECOND 字面值,语法格式:
    [+|-][ d] [ h[: m[: s]]]’ [DAY[( days_precision)]])[TO HOUR | MINUTE | SECOND[( seconds_precision)]] ↩︎

  3. 需要向数据库提供一个 INTERVAL YEAR TO MONTH 字面值,语法格式:
    [+|-] integer [- integer]’ {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}] ↩︎

  4. 在跨越多时区的系统里,timestamp with timezone 或者 timestamp with local timezone 比较重要:
    timestamp with time zone 表达的是针对标准时区(格林尼治时间)的差。
    timestamp with local time zone 表达的是根据你当前所处时区,变化你和格林尼治时间的差。 ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值