日期时间处理(java、js、pgsql)

一、时间格式

1、整体说明

#年-月-日 时:分:秒
yyyy-MM-dd HH:mm:ss

大写 M 是 “” ,小写 m 是 “

大写的 H24 小时制,小写的 h12 小时制。

注意:

书写格式和语言规定有关,上述写法是Windows系统中的我们常见的写法,包括日期设置于办公软件在内。在其他语言中有类似的但使用符号或格式不同的写法。

有的时候我们会看到这样的格式:yyyy-M-d H:m:s

H,m,s表示非零开始HH,mm,ss表示从零开始

比如凌晨1点2分,HH:mm显示为01:02,H:m显示为1:2

2、局部说明

以2014年1月1日凌晨1点1分1秒(当天是星期三)为例子介绍一下其他的:

(1)年

yyyy/yyy/yy/y 显示为 2014/2014/14/4
(3个y与4个y是一样的,为了便于理解多写成4个y)

(2)月

MMMM/MMM/MM/M 显示为 一月/一月/01/1
(4个M显示全称,3个M显示缩写,不过中文显示是一样的,英文就是January和Jan)

(3)日

dddd/ddd/dd/d 显示为 星期三/周三(有的语言显示为“三”)/01/1
(在英文中同M一样,4个d是全称,3个是简称;dddd/ddd表示星期几,dd/d表示几号)

(4)时

HH/H/hh/h 显示为 01/1/01 AM/1 AM

(5)分秒

剩下的**mm/m/ss/s**只是前导零的问题了。

yyyy/M/d/dddd H:mm:ss 就是 2014年1月1日星期三 1:01:01

二、JAVA

1、格式化(SimpleDateFormat)

注意:SimpleDateFormat 有线程安全问题,不能定义为成员变量。

(1)案例一

/**
SimpleDateFormat函数语法:

G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区
*/
public static void main(String[] args) {
    SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
    SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm"); 
    SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
    SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
    SimpleDateFormat myFmt4=new SimpleDateFormat("一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
    Date now=new Date();
    System.out.println(myFmt.format(now));
    System.out.println(myFmt1.format(now));
    System.out.println(myFmt2.format(now));
    System.out.println(myFmt3.format(now));
    System.out.println(myFmt4.format(now));
    System.out.println(now.toGMTString());
    System.out.println(now.toLocaleString());
    System.out.println(now.toString());
}    

结果:

2004年12月16日 17时24分27秒
04/12/16 17:24
2004-12-16 17:24:27
2004年12月16日 17时24分27秒 星期四
一年中的第 351 天 一年中第51个星期 一月中第3个星期 在一天中17时 CST时区
16 Dec 2004 09:24:27 GMT
2004-12-16 17:24:27
Thu Dec 16 17:24:27 CST 2004

参考

SimpleDateFormat使用详解及与毫秒的相互转换

https://blog.csdn.net/zhangxinihaoxi/article/details/106626957

(2)案例二

SimpleDateFormat year = new SimpleDateFormat("yyyy");
SimpleDateFormat m = new SimpleDateFormat("MM");
SimpleDateFormat d = new SimpleDateFormat("dd");

Date date = new Date();
year.format(date);
m.format(date);
d.format(date);

2、当前时间

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Time {
    private static void timeTest() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 方法一
        System.out.println(System.currentTimeMillis());
        
        // 方法二
        Date date = new Date();
        date = sdf.parse("2021-03-04 16:16:00");
        System.out.println(date.getTime());
        
        // 方法三
        Calendar calendar = Calendar.getInstance();
        long time = calendar.getTimeInMillis();
        System.out.println(time);
        
        // 方法四
        Calendar cal=Calendar.getInstance();      
        int y=cal.get(Calendar.YEAR);      
        int m=cal.get(Calendar.MONTH);      
        int d=cal.get(Calendar.DATE);      
        int h=cal.get(Calendar.HOUR_OF_DAY);      
        int mi=cal.get(Calendar.MINUTE);      
        int s=cal.get(Calendar.SECOND);      
        System.out.println("现在时刻是"+y+"年"+m+"月"+d+"日"+h+"时"+mi+"分"+s+"秒");
    }
}

3、Calendar使用

(1)获取时间

Calendar cal = Calendar.getInstance();
int y = cal.get(Calendar.YEAR);
int m = cal.get(Calendar.MONTH);
int d = cal.get(Calendar.DATE);
int h = cal.get(Calendar.HOUR_OF_DAY);
int mi = cal.get(Calendar.MINUTE);
int s = cal.get(Calendar.SECOND);
System.out.println("现在时刻是" + y + "年" + m + "月" + d + "日" + h + "时" + mi + "分" + s + "秒");

// 获取当前是本周第几天
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);  
// 获取当前是本月第几天
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);  
// 获取当前是本年第几天
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);

(2)设置时间

Calendar instance = Calendar.getInstance();
instance.set(Calendar.YEAR, 2021);
instance.set(Calendar.MONTH, 1);//月份取值范围[0,11]
System.out.println(sdf.format(instance.getTime()));

(3)时间计算

Calendar cal = Calendar.getInstance();
System.out.println(sdf.format(cal.getTime()));
// 加1年
cal.add(Calendar.YEAR, 1);
// 加1月
cal.add(Calendar.MONTH, 1);
// 加1天
cal.add(Calendar.DATE, 1);
// 加1小时
cal.add(Calendar.HOUR_OF_DAY, 1);
// 加1分钟
cal.add(Calendar.MINUTE, 1);
// 加1秒钟
cal.add(Calendar.SECOND, 1);
System.out.println(sdf.format(cal.getTime()));

// 减1年
cal.add(Calendar.YEAR, -1);
System.out.println(sdf.format(cal.getTime()));

结果:

2022-06-01 22:01:12
2023-07-02 23:02:13
2022-07-02 23:02:13

(4)当月最后一天

获取2021年2月的最后一天,可以使用下面两种方法:

方法一

Calendar instance = Calendar.getInstance();
instance.set(Calendar.YEAR,2021);
instance.set(Calendar.MONTH,1);//月份取值范围[0,11]
instance.set(Calendar.DATE,instance.getActualMaximum(Calendar.DATE));
System.out.println(instance.getTime());//Sun Feb 28 19:08:33 CST 2021

方法二

Calendar instance = Calendar.getInstance();
instance.set(Calendar.YEAR,2021);
instance.set(Calendar.MONTH,2);
instance.set(Calendar.DATE,0);//表示取当前月份的前一天
System.out.println(instance.getTime());//Sun Feb 28 19:08:33 CST 2021

(5)当月第一天

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 1);

(5)获取上个星期第一天的某个小时的时间戳

public static Long getPreviousWeekday(int hour) {
        int week = -1;
        int mondayPlus = getMondayPlus();
        GregorianCalendar currentDate = new GregorianCalendar();
        currentDate.add(Calendar.DATE, mondayPlus + 7 * week);
        Date monday = currentDate.getTime();
        TimeZone curTimeZone = TimeZone.getTimeZone("GMT+8");
        Calendar c = Calendar.getInstance(curTimeZone);
        c.setTime(monday);
        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
       // Date z = c.getTime();
       // SimpleDateFormat sdf = new SimpleDateFormat(yyyy_MM_dd);
       // System.out.println(sdf.format(z));
        return  c.getTime().getTime();
    }
 
 
 
public static int getMondayPlus() {
        Calendar cd = Calendar.getInstance();
        int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1;
        if (dayOfWeek == 1) {
            return 0;
        }
        return (1 - dayOfWeek);
    }

三、JavaScript

1、格式化

// 简单的一句代码
var date = new Date(时间戳); //获取一个时间对象

/**
 \1. 下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了
 \2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_obj_date.asp
 */
date.getFullYear(); // 获取完整的年份(4位,1970)
date.getMonth(); // 获取月份(0-11,0代表1月,用的时候记得加上1)
date.getDate(); // 获取日(1-31)
date.getTime(); // 获取时间(从1970.1.1开始的毫秒数)
date.getHours(); // 获取小时数(0-23)
date.getMinutes(); // 获取分钟数(0-59)
date.getSeconds(); // 获取秒数(0-59)

 
// 比如需要这样的格式 yyyy-MM-dd hh:mm:ss
var date = new Date(1398250549490);
Y = date.getFullYear() +-;
M = (date.getMonth()+1 < 10 ?0+(date.getMonth()+1) : date.getMonth()+1) +-;
D = date.getDate() + ‘ ‘;
h = date.getHours() +:;
m = date.getMinutes() +:;
s = date.getSeconds(); 
console.log(Y+M+D+h+m+s); 
// 输出结果:2014-04-23 18:55:49

2、反格式化

(1)案例代码

// 也很简单
var strtime =2014-04-23 18:55:49:123;
var date = new Date(strtime); //传入一个时间格式,如果不传入就是获取现在的时间了,这样做不兼容火狐。
// 可以这样做
var date = new Date(strtime.replace(/-/g,/));

// 有三种方式获取,在后面会讲到三种方式的区别
time1 = date.getTime();
time2 = date.valueOf();
time3 = Date.parse(date);

/* 
三种获取的区别:
第一、第二种:会精确到毫秒
第三种:只能精确到秒,毫秒将用0来代替
比如上面代码输出的结果(一眼就能看出区别):
1398250549123
1398250549123
1398250549000 
*/

(2)Date()参数

new Date("yyyy/MM/dd hh:mm:ss");
new Date("yyyy/MM/dd");
new Date(yyyy,mth,dd);

//比如:
new Date("2016/09/16 14:15:05");
new Date("2016/09/16");
new Date(2016,8,16);

四、PostgreSQL数据库

1、格式化

SELECT to_char(now(), 'yyyy-MM-dd hh24:mi:ss');

2、反格式化

PostgreSQL数据库的 to_dateto_timestamp 可以将字符串转换为时间格式。

二者区别:

  • to_data 转换为 普通的时间格式
  • to_timestamp 转换可为 时间戳格式
-- 转换为日期
SELECT to_date('2022-06-01 22:29:37', 'yyyy-MM-dd hh24:mi:ss');
-- 转换为时间戳
SELECT to_timestamp('2022-06-01 22:29:37', 'yyyy-MM-dd hh24:mi:ss');

https://blog.csdn.net/sky_limitless/article/details/79527665

3、时间比较

注意:date类型的时间和timestamp类型的时间不能互相比较

4、当前时间

-- 当前日期
SELECT CURRENT_DATE 
-- 当前时间
SELECT CURRENT_TIME

-- 以下三种时间戳是相同的
-- 当前时间戳
SELECT CURRENT_TIMESTAMP
-- 当前时间戳
SELECT now()
-- 当前时间戳
SELECT transaction_timestamp()

5、时间运算

(1)加法

SELECT now()::timestamp + '1 year';  --当前时间加1年
SELECT now()::timestamp + '1 month';  --当前时间加一个月
SELECT now()::timestamp + '1 day';  --当前时间加一天
SELECT now()::timestamp + '1 hour';  --当前时间加一个小时
SELECT now()::timestamp + '1 min';  --当前时间加一分钟
SELECT now()::timestamp + '1 sec';  --加一秒钟
select now()::timestamp + '1 year 1 month 1 day 1 hour 1 min 1 sec';  --加1年1月1天1时1分1秒
SELECT now()::timestamp + (col || ' day')::interval FROM table --把col字段转换成天 然后相加
12345678

(2)减法

需要反向操作

select CURRENT_TIMESTAMP::TIMESTAMP + '-5 day'

参考:https://blog.csdn.net/qq_41483673/article/details/103819407

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值