Claws Garden

DateTime日期时间处理专题

每次需要格式化时间和日期时都要在网上查询相关的教程,索性自己写一份总结用来备忘好了。

每种语言中对日期的描述不一定一样,但是日期时间的表达方式无非几种:时间戳(给机器看)、字符串(给人看)以及日期时间对象(计算、运行时)。

按照如下几种常用的操作进行整理:获取当前时间(日期),字符串转时间(日期)对象,时间(日期)对象转字符串,时间戳转时间(日期)对象,时间(日期)对象转时间戳。

首先,明确一些基本概念:

Python

用到的库:datetime(原生,无需额外安装)

datetime库中有好几个类,经常使用:

date

使用时首先要from datetime import date

获取当前日期

1from datetime import date
2
3today = date.today()
4print(today)
5# output(example):
6# 2022-09-24

字符串转日期

1from datetime import date
2date_from_str = date.fromisoformat("2022-09-24")
3print(date_from_str)
4# output
5# 2022-09-24

日期转字符串

1from datetime import date
2str_from_date = date.today().strftime(format='%Y-%m-%d %a %H%M%S')
3print(str_from_date)
4# output(example)
5# 2022-09-24 Sat 000000

时间戳转日期

1from datetime import date,datetime
2now_day = date.fromtimestamp(datetime.now().timestamp())
3print(now_day)
4# output(example)
5# 2022-09-24

datetime

获取当前时间

1from datetime import datetime
2print(datetime.now())
3# output(example)
4# 2022-09-24 13:25:21.517404
5# 默认UTC+0

字符串转时间

1from datetime import datetime
2print(datetime.fromisoformat("2011-11-04T00:05:23+04:00"))
3# output
4# 2011-11-04 00:05:23+04:00
5# python不支持末尾有Z的,直接去掉Z转换就可以了

或者另一种更加通用的strptime函数:

1from datetime import datetime
2print(datetime.strptime(r"2011-11-04T00:05:23.283+04:00", r"%Y-%m-%dT%H:%M:%S.%f%z"))
3print(datetime.strptime(r"2011-11-04T00:05:23.283000+0400", r"%Y-%m-%dT%H:%M:%S.%f%z"))
4# output:
5# 2011-11-04 00:05:23.283000+04:00
6# 2011-11-04 00:05:23.283000+04:00

时间转字符串

1from datetime import datetime
2test_time = datetime.strptime(r"2011-11-04T00:05:23.283+04:00", r"%Y-%m-%dT%H:%M:%S.%f%z")
3print(test_time.strftime("%y-%m-%dT%H%p%M:%S%Z"))
4# output
5# 11-11-04T00AM05:23UTC+04:00

时间戳转时间

1from datetime import datetime
2test_time = datetime.fromtimestamp(1664027067)
3print(test_time)
4# output
5# 2022-09-24 13:44:27
6# 只接受10位时间戳

时间转时间戳

1from datetime import datetime
2test_time = datetime.fromtimestamp(1664027067)
3print(test_time.timestamp())
4# output
5# 1664027067.0
6# Python中时间戳是float类型的

timedelta

表示时间段、时间偏移量,可以直接和date、datetime对象相加,例如

1from datetime import datetime, timedelta
2new_time = datetime.now() + timedelta(days = 1)
3print(new_time)
4# output
5# 2022-09-25 13:48:16.031319

Java

Java中使用Date类来表示日期和时间。jdk8以后,引入了新的LocalDateTime类表示时间,更加灵活。

Date

获取当前时间

1Date date = new Date();

时间转字符串

1Date date = new Date();
2SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss zzzz", Locale.JAPAN);
3// 设定时区
4simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
5System.out.println(simpleDateFormat.format(date));

字符串转时间

1String timeStr = "2022-09-25 02:21:38 CST";
2try {
3    Date dateParsed = simpleDateFormat.parse(timeStr);
4    System.out.println(simpleDateFormat.format(dateParsed));
5} catch (ParseException e) {
6    throw new RuntimeException(e);
7}

时间转时间戳

1// Java 默认13位时间戳,带毫秒
2System.out.println(date.getTime());

时间戳转时间

1Date date1 = new Date(1664044092703L);

时间跨度的计算

时间跨度最佳计算方法是用时间戳进行计算。借助TimeUnit库来转换各个单位到毫秒后,就可以在时间戳上直接加减处理。

1long millis = TimeUnit.DAYS.toMillis(1);
2Date date2 = new Date(date1.getTime() + millis);
3System.out.println(date2);

LocalDateTime

此部分参考ZonedDateTime - 廖雪峰的官方网站 (liaoxuefeng.com)

LocalDateTime系列有三个组件:LocalDate、LocalTime、LocalDateTime,ZonedDateTime和Instant

关系如下:

image-20221115174836192

即,LocalDateTime通过标注时区可以得到ZonedDateTime,然后ZonedDateTime可以转为Instant和时间戳。

获得当前时间

 1LocalDate d = LocalDate.now(); // 当前日期
 2LocalTime t = LocalTime.now(); // 当前时间
 3LocalDateTime dt = LocalDateTime.now(); // 当前日期和时间
 4System.out.println(d); // 严格按照ISO 8601格式打印
 5System.out.println(t); // 严格按照ISO 8601格式打印
 6System.out.println(dt); // 严格按照ISO 8601格式打印
 7
 8// 获得时间戳
 9Instant instant = Instant.now();
10long timeStampMillis = instant.toEpochMilli(); // 获得13位时间戳
11long timeStampSeconds = instant.getEpochSecond(); // 获得10位时间戳

类型互转

1// 以上方法可能会以为执行语句的时间消耗导致前后d t dt产生的时间不一致,可以用下面的方式获得一致的date和time
2LocalDateTime dt2 = LocalDateTime.now(); // 当前日期和时间
3LocalDate d2 = dt2.toLocalDate(); // 转换到当前日期
4LocalTime t2 = dt2.toLocalTime(); // 转换到当前时间
5LocalDateTime localDateTime = localDate.atStartOfDay(); // 日期转时间日期
6LocalDateTime localDateTime2 = localTime.atDate(d2); // 时间转时间日期

时间加减和调整

可以给时间做简单的加减和设置。

1LocalDateTime dt2 = dt.plusDays(5).minusHours(3);
2LocalDateTime dt3 = dt.withDayOfMonth(31);

时间转字符串

1String dateString = LocalDate.now().toString();
2String timeString = LocalTime.now().toString();
3String dateTimeString = LocalDateTime.now().toString();

字符串转时间

通过parse方法

1LocalDate localDate = LocalDate.parse("2022-11-15");
2LocalTime localTime = LocalTime.parse("16:59:38.332");
3LocalDateTime localDateTime = LocalDateTime.parse("2022-11-15T16:59:38.332");

时间转时间戳

因为LocalDateTime没有时区信息,因此不能直接转时间戳,要先标注时区变成ZonedDateTime再转,再转成高精度时间戳类Instant

1LocalDateTime localDateTime = LocalDateTime.now();
2ZonedDateTime ctt = localDateTime.atZone(ZoneId.of("CTT")); //处理时区
3long timestamp = ctt.toInstant().toEpochMilli(); // 13位时间戳
4long epochSecond = ctt.toInstant().getEpochSecond(); // 10位时间戳

时间戳转时间

1Instant ins = Instant.ofEpochSecond(1568568760L);
2ZonedDateTime zdt = ins.atZone(ZoneId.systemDefault());

JavaScript

JavaScript 中使用 Date类表示时间。

获取当前时间

1// 获得的是一个13位时间戳
2let timestamp = new Date().getTime();

其他语言的还在施工中,日后补充……

#Python #Java