时间戳格式化

一、须知:

1. 纯数字时间戳分2种,一种是10位的,只包含年月日时分秒,也就是说,只精确到秒。一种是13位的,包含毫秒。这2种都叫时间戳,并不是只有精确到毫秒的才叫时间戳。

10位时间戳就是从1970-01-01到当前的秒数,注意,不是毫秒数,所以需要按毫秒解析时,要 * 1000
13位时间戳就是从1970-01-01到当前的毫秒数,在java中用Instant对象对应。

2. timestamp的格式化串用大写的S来表示毫秒数。S的个数和毫秒的位数严格对应,否则报错。如果规范中要求精确到毫秒,那么给的时间字符串,那肯定是3位。给2位精确不到毫秒,给4位,获取到的毫秒数也不会包含毫秒之外的信息。

  @Test
  def tt3(): Unit = {
    val dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
    //时间戳和时间对象互转
    println(LocalDateTime.parse("2020-04-04 08:08:08.123", dtf).toInstant(ZoneOffset.of("+8")).toEpochMilli) //1585958888123
    println(LocalDateTime.ofInstant(Instant.ofEpochMilli(1585958888123L), ZoneOffset.of("+8"))) //2020-04-04T08:08:08.123

    //这2个值是一样的,上面的解析秒,下面的是 * 1000 后解析毫秒
    println(LocalDateTime.ofEpochSecond(1585958888L, 0, ZoneOffset.ofHours(8))) //2020-04-04T08:08:08
    println(LocalDateTime.ofInstant(Instant.ofEpochMilli(1585958888000L), ZoneOffset.of("+8"))) //2020-04-04T08:08:08
  }

在这里插入图片描述

3. LocalDateTime.ofEpochSecond(1585958888L, 0, ZoneOffset.ofHours(8))用来把秒数转为时间对象。LocalDateTime.ofInstant(Instant.ofEpochMilli(1585958888000L), ZoneOffset.of("+8"))用来把毫秒数转为时间对象。Epoch的意思是从1970-01-01开始。

二、Hive中对时间戳的支持

Hive并没有提供13位时间戳的转换函数,但是load的时候,会自动识别形如"2020-04-04 08:08:08.123"这种带毫秒数的时间戳,会正常导入且能正常显示和使用。

Hive中10位纯数字时间戳的转换:
https://www.cnblogs.com/dcx-1993/p/11359139.html

### Java 时间戳格式化方法 在 Java 中,可以使用 `SimpleDateFormat` 类将 Unix 时间戳转换为指定格式的日期字符串。以下是具体实现过程: #### 实现代码示例 以下是一个完整的代码示例,展示了如何将时间戳(如 1692684946)转换为可读的日期格式。 ```java import java.text.SimpleDateFormat; import java.util.Date; public class TimestampFormatter { public static void main(String[] args) { long timestamp = 1692684946; // 输入的时间戳 Date date = new Date(timestamp * 1000L); // 将秒级时间戳转为毫秒 // 定义日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 转换并输出结果 String formattedDate = sdf.format(date); System.out.println("转换后的时间为:" + formattedDate); } } ``` 上述代码中,通过将输入的时间戳乘以 1000 来将其从秒级别转换为毫秒级别[^3]。接着利用 `SimpleDateFormat` 对象定义所需的日期格式,并调用其 `format()` 方法完成时间戳向日期字符串的转换。 --- ### 获取当前时间的时间戳 如果需要获取当前时间的时间戳,则可以通过 `System.currentTimeMillis()` 或者 `Calendar.getInstance().getTimeInMillis()` 的方式实现[^2]。例如: ```java // 使用 System.currentTimeMillis() 获取当前时间戳 long currentTimestamp = System.currentTimeMillis() / 1000L; // 秒级时间戳 System.out.println("当前时间戳(秒): " + currentTimestamp); // 使用 Calendar 获取当前时间戳 import java.util.Calendar; Calendar calendar = Calendar.getInstance(); long currentTimeMillis = calendar.getTimeInMillis() / 1000L; // 秒级时间戳 System.out.println("当前时间戳(秒): " + currentTimeMillis); ``` 以上两种方法均可返回当前时间对应的秒级时间戳。 --- ### 自定义日期格式 除了常见的 `"yyyy-MM-dd HH:mm:ss"` 格式外,还可以根据需求自定义其他日期格式。例如: - 只显示日期部分:`"yyyy-MM-dd"` - 显示带有时区的信息:`"yyyy-MM-dd'T'HH:mm:ssZ"` 修改 `SimpleDateFormat` 构造器参数即可调整最终输出的结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值