长 LONG 型储存时间的意义是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kimwang
V2EX    PHP

长 LONG 型储存时间的意义是什么?

  •  
  •   kimwang 2017-01-03 20:04:59 +08:00 8037 次点击
    这是一个创建于 3211 天前的主题,其中的信息可能已经有所发展或是发生改变。
    见到有些程序用长整型数据存储时间,中间实现需要数据的转化,特意转化成长整型,出库时又要转换一次,这么做的目的是什么?有效率还是其它优势 /方便?
    28 条回复    2017-01-04 22:55:32 +08:00
    RE
        1
    RE  
       2017-01-03 20:17:57 +08:00 via iPhone   1
    你说的是 timestamp ?
    rainex
        2
    rainex  
       2017-01-03 20:19:59 +08:00   1
    没看懂你到底问的是什么,只能说
    1 部分数据库,用数字类型的字段存储时间戳,比用日期型的字段, sql 性能好一些
    2 多年没看过 php 了,记得好像是没 long 类型,只有 float 类型? 32 位 php 的 int 存储当前时间的毫秒位数不够,有诸如此类的问题。
    3 也有可能是部分码神瞎胡写
    weyou
        3
    weyou  
       2017-01-03 20:31:01 +08:00 via Android   1
    是说用 int64 来表示时间么?
    smilezino
        4
    smilezino  
       2017-01-03 20:37:46 +08:00   2
    时间戳无关于时区
    loggerhead
        5
    loggerhead  
       2017-01-03 20:43:28 +08:00   1
    1. 没有歧义
    2. 省空间
    3. 某些情况下进行运算的时候省时间
    murmur
        6
    murmur  
       2017-01-03 20:43:47 +08:00   1
    因为有的时候你的却搞不懂每个数据库的 datetime 倒是是个什么玩意儿 有的是 date 有的是 string
    long 的话你能搞清楚
    而且比较大小、做差的时候 long 更简单一点点
    jarlyyn
        7
    jarlyyn  
       2017-01-03 20:51:03 +08:00   2
    问题是用数字还是长整?
    kimwang
        8
    kimwang  
    OP
       2017-01-03 20:51:32 +08:00
    不好意思,我在自学 PHP ,概念说得不准确,已在物色合适的图书购买。

    说回问题,其实 ip2long 和这种将时间转化为 INT(11)的格式存入数据库,它的作用是什么?如果要进行输出或者对比不是更麻烦? MYSQL 本身就有时间型,为什么他们不用呢?

    为了描述问题,我放了两张图片,谢谢。

    数据类型设置情况:
    http://i1.piimg.com/4851/47e0d51ff5a1d1d5.png

    转化后保存到数据库的情况:
    http://i1.piimg.com/4851/04518dff3e52fa6d.png
    kimwang
        9
    kimwang  
    OP
       2017-01-03 20:54:19 +08:00
    @jarlyyn

    你好
    用的:
    INT 或 INTEGER 4 字节 (-2 147 483 648 , 2 147 483 647) (0 , 4 294 967 295) 大整数值

    保存后的情况请看 8 楼的第二张图片。
    Troevil
        10
    Troevil  
       2017-01-03 20:55:50 +08:00   1
    @kimwang 抛开需求看问题通常都是没有结论的, 这个设计直接问这个项目的设计者不就好了, 无论是 时间戳 还是 datetime 都是各有利弊的, 三个字 `看需求`
    kimwang
        11
    kimwang  
    OP
       2017-01-03 20:56:51 +08:00
    @RE @smilezino 我描述得不够好让你误会,不是时间戳的问题,请看 8 楼补充。
    kimwang
        12
    kimwang  
    OP
       2017-01-03 20:58:05 +08:00
    @weyou 是的,大概是这意思,我当时浏览的程序用了 MYSQL 大整数值(数据类型)_int(11)
    RE
        13
    RE  
       2017-01-03 21:10:05 +08:00   1
    @kimwang

    你这截图就是时间戳啊,估计你看的教程也不准确,
    1. 存储时间戳只需要 10 位不需要 11 位,
    2. 因为时间没有负数形式(准确的说是 1970 年 1 月 1 日到现在不存在负数)所以勾选 unsigned 这样可以得到更大的最大值。

    时间戳( timestamp )指的是 1970 年 1 月 1 日开始到某个时间点的秒数,不记录时区等信息。数据量庞大的情况下,如果需要计算一些时间差、时间范围等,数字形式比日期形式更好直接计算。

    估计是你用的 mysql 编辑器自动把 nt 加上了逗号分隔,让你有了疑惑(这点是结合你之前的帖子猜测的)。
    zhidian
        14
    zhidian  
       2017-01-03 21:12:04 +08:00
    因为从一开始,时间就是整形,那叫 Unix Time 或者说 Epoch Time (创世纪?)。但是 unix time 用的 int32 ,精度不够(精确到 s ),后来大家都觉得应该用毫秒啊!于是换了 int_64 来存,记得以前自己算过,按照毫秒够用几百万世纪。(当时我的疑问是“为什么要用 signed ,少了一半的可用区间啊?!”)
    zhidian
        15
    zhidian  
       2017-01-03 21:15:27 +08:00   1
    外,转化为整形对比更简单啊。直接做差,然后用 / 和 % 就可以算出每个时间精度的量。
    murmur
        16
    murmur  
       2017-01-03 21:17:45 +08:00
    @jarlyyn mysql 里的普通 int 不够要用 big int 级别的 大整和长整。。翻译问题吧
    x8
        17
    x8  
       2017-01-03 21:19:57 +08:00
    你精度只到秒,目前来看 int32 是够的,到毫秒不够
    qiayue
        18
    qiayue  
    PRO
       2017-01-03 21:20:19 +08:00   1
    不同的需求,用不同的存储格式,比如我要找出距今 2 小时内的所有记录,是不是用整形记录的时间(时间戳)更方便
    kimwang
        19
    kimwang  
    OP
       2017-01-03 21:22:27 +08:00
    @RE
    估计是你用的 mysql 编辑器自动把 int 加上了逗号分隔,让你有了疑惑(这点是结合你之前的帖子猜测的)。
    RE:对,可能有这个情况,因为数据库内逢千位打逗号我一时间没缓过来,以为搞财务呢。

    我查到了
    http://www.cnblogs.com/thingk/p/3826751.html
    是时间戳的问题,谢谢。
    woshifyz
        20
    woshifyz  
       2017-01-03 21:24:32 +08:00   1
    1. code 方便
    2. 规避可能出现的时区问题,用 datetime 的话,到时候碰到时区问题就麻烦了
    skydiver
        21
    skydiver  
       2017-01-03 23:37:33 +08:00 via iPad
    @zhidian 不用 signed 怎么表示 1970 年以前。。
    tigerstudent
        23
    tigerstudent  
       2017-01-04 08:04:22 +08:00
    1 、楼主说的长整型应该是指 32 位的 long 吧。
    2 、对 c 语言来说,在不同的编译器或平台, int 可能是 16 位或 32 位的;从这个角度来说,统一使用 long 可以保持统一。
    zhidian
        24
    zhidian  
       2017-01-04 09:57:52 +08:00
    @skydiver 现在才反应过来原来有表示 1970 年前的时间这个需求……
    skydiver
        25
    skydiver  
       2017-01-04 10:23:04 +08:00 via Android
    @tigerstudent 一般的平台上 long 是 64bit int 才是 32bit
    tigerstudent
        26
    tigerstudent  
       2017-01-04 17:12:30 +08:00 via Android
    @skydiver 非也。 long long 才是 64 位的。
    skydiver
        27
    skydiver  
       2017-01-04 17:17:04 +08:00
    @tigerstudent 在 64bit Linux 环境下, int 是 32 位, long 和 long long 都是 64 位
    mingyun
        28
    mingyun  
       2017-01-04 22:55:32 +08:00
    @thekll nice
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1393 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:36 PVG 00:36 LAX 09:36 JFK 12:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86