深入理解java long 存储时间戳

时间:2022-08-27 21:21:13

存储时间打算用时间戳来存储,打算用long类型来代表时间戳,但是在用long类型存储时间戳的时候出了点问提。

在写单元测试的时候,用一个long类型来存储时间戳,发现编译器报错了

深入理解java long 存储时间戳

刚开始猜想可能是因为long不够大,存储不了。然后用double类型来存:

深入理解java long 存储时间戳

发现还是报错了,仔细想想不对,double存储的数量应该时很大的,不会连时间戳都存储不了。
在后面加上小数点之后,居然可以存了:

深入理解java long 存储时间戳

加了小数点之后就能存了,仔细一想,之前没加小数点的时候他是整数,加了小数点之后变成了浮点数,猜测之前没加上小数点的时间戳是一个整形的字面值,加上小数点后是一个浮点数的字面值,之前的报错应该不是存储类型的问题,而是字面值范围超出了。

用字符串来测试:

深入理解java long 存储时间戳

把时间戳变成字符串的字面值,在将他解析成long类型的和int类型的,然后在把他们输出:

深入理解java long 存储时间戳

发现第一个long类型的成功输出了,而int类型的却报了一个number的错误.

这说明long是可以存储时间戳的,而int存储不了时间戳,所以判断之前不能存储时因为字面值为整形超出了范围。

java 各种日期/时间 对象转long时间戳

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package cn.xbz;
 
import java.text.simpledateformat;
import java.time.*;
import java.time.format.datetimeformatter;
import java.util.calendar;
import java.util.date;
 
/**
 * @title 各种日期/时间对象转时间戳
 * @author xingbz
 * @createdate 2018-5-18
 */
public class datetime2millisdemo {
 
 private static final string format_str = "yyyy-mm-dd hh:mm:ss";
 
 public static void main(string[] args) {
  system.out.println("====== jdk7及之前 ======");
  long l1 = getmillis1();
  long l2 = date2millis(new date());
  long l3 = calendar2millis(calendar.getinstance());
  long l4 = string2millis(new simpledateformat(format_str).format(new date()) , format_str);//为了与以上几个保持一致
  system.out.println(l1 + "\n" + l2 + "\n" + l3 + "\n" + l4);//会有几毫秒的差别
 
  system.out.println("====== jdk8 ======");
  long l5 = getmillis2();
  long l6 = localdatetime2millis(localdatetime.now());
  long l7 = localdate2millis(localdate.now());
  long l8 = clock2millis(clock.systemutc());
  long l9 = zonedatetime2millis(zoneddatetime.now());
  long l10 = string2milliswithjdk8(localdatetime.now().format(datetimeformatter.ofpattern(format_str)) , format_str);//为了与以上几个保持一致
  system.out.println(l5 + "\n" + l6 + "\n" + l7 + "\n" + l8 + "\n" + l9 + "\n" + l10);//会有几毫秒的差别
 }
 
 /* jdk7及之前 */
 
 /** 获取时间戳 */
 public static long getmillis1() {
  return system.currenttimemillis();
 }
 
 /** date转时间戳 */
 public static long date2millis(date date) {
  return date.gettime();
 }
 
 /** calendar转时间戳 */
 public static long calendar2millis(calendar calendar) {
  return calendar.gettime().gettime();
 }
 
 /** 日期字符串转时间戳 */
 public static long string2millis(string datestr, string formatstr) {
  try {
   simpledateformat simpledateformat = new simpledateformat(formatstr);
   return simpledateformat.parse(datestr).gettime();
  } catch (exception e) {
   return 0l;
  }
 }
 
 /* jdk8 */
 
 /** 获取时间戳 */
 public static long getmillis2() {
  return instant.now().toepochmilli();
 }
 
 /** localdatetime转时间戳 */
 public static long localdatetime2millis(localdatetime localdatetime) {
  return localdatetime.toinstant(zoneoffset.ofhours(8)).toepochmilli();
 }
 
 /** localdate转时间戳 */
 public static long localdate2millis(localdate localdate) {
  return localdatetime.of(localdate, localtime.min).toinstant(zoneoffset.ofhours(8)).toepochmilli();
 }
 
 /** clock转时间戳 */
 public static long clock2millis(clock clock) {
  return clock.millis();
 }
 
 /** zonedatetime转时间戳(这个不常用吧~) */
 public static long zonedatetime2millis(zoneddatetime zoneddatetime) {
  return zoneddatetime.tolocaldatetime().toinstant(zoneoffset.ofhours(8)).toepochmilli();//!!!好费劲
 }
 
 /** string转时间戳(jdk8) */
 public static long string2milliswithjdk8(string datestr , string formatstr) {
  return localdatetime.parse(datestr , datetimeformatter.ofpattern(formatstr)).toinstant(zoneoffset.ofhours(8)).toepochmilli();
 }
}

输出如下 :

深入理解java long 存储时间戳

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000016727089