存储时间打算用时间戳来存储,打算用long类型来代表时间戳,但是在用long类型存储时间戳的时候出了点问提。
在写单元测试的时候,用一个long类型来存储时间戳,发现编译器报错了
刚开始猜想可能是因为long不够大,存储不了。然后用double类型来存:
发现还是报错了,仔细想想不对,double存储的数量应该时很大的,不会连时间戳都存储不了。
在后面加上小数点之后,居然可以存了:
加了小数点之后就能存了,仔细一想,之前没加小数点的时候他是整数,加了小数点之后变成了浮点数,猜测之前没加上小数点的时间戳是一个整形的字面值,加上小数点后是一个浮点数的字面值,之前的报错应该不是存储类型的问题,而是字面值范围超出了。
用字符串来测试:
把时间戳变成字符串的字面值,在将他解析成long类型的和int类型的,然后在把他们输出:
发现第一个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(); } } |
输出如下 :
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
原文链接:https://segmentfault测试数据/a/1190000016727089
查看更多关于深入理解java long 存储时间戳的详细内容...