V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
6680101
V2EX  ›  PHP

请问怎么把“多少小时前”精确到“多少小时多少分钟前”

  •  1
     
  •   6680101 · 2018-10-29 17:50:21 +08:00 · 4998 次点击
    这是一个创建于 2251 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网站默认的时间格式,是“多少小时前”,觉得太单薄,想像 V2EX 这样,显示“多少小时多少分钟前”, 小白一个,请大神指教,多谢!

    原代码如下:

    function humandate($timestamp, $lan = array()) { $time = $_SERVER['time']; $lang = $_SERVER['lang'];

        static $custom_humandate = NULL;
        if($custom_humandate === NULL) $custom_humandate = function_exists('custom_humandate');
        if($custom_humandate) return custom_humandate($timestamp, $lan);
    
        $seconds = $time - $timestamp;
        $lan = empty($lang) ? $lan : $lang;
        empty($lan) AND $lan = array(
                'month_ago'=>'月前',
                'day_ago'=>'天前',
                'hour_ago'=>'小时前',
                'minute_ago'=>'分钟前',
                'second_ago'=>'秒前',
        );
        if($seconds > 31536000) {
                return date('Y-n-j', $timestamp);
        } elseif($seconds > 2592000) {
                return floor($seconds / 2592000).$lan['month_ago'];
        } elseif($seconds > 86400) {
                return floor($seconds / 86400).$lan['day_ago'];
        } elseif($seconds > 3600) {
                return floor($seconds / 3600).$lan['hour_ago'];
        } elseif($seconds > 60) {
                return floor($seconds / 60).$lan['minute_ago'];
        } else {
                return $seconds.$lan['second_ago'];
        }
    

    }

    第 1 条附言  ·  2018-10-29 22:26:07 +08:00
    参照#13 @yhxx 的思路,做了下面的更改,可惜无效,有哪位大哥知道原因吗?

    原来代码:

    if($seconds > 31536000) {
    return date('Y-n-j', $timestamp);
    } elseif($seconds > 2592000) {
    return floor($seconds / 2592000).$lan['month_ago'];
    } elseif($seconds > 86400) {
    return floor($seconds / 86400).$lan['day_ago'];
    } elseif($seconds > 3600) {
    return floor($seconds / 3600).$lan['hour_ago'];
    } elseif($seconds > 60) {
    return floor($seconds / 60).$lan['minute_ago'];
    } else {
    return $seconds.$lan['second_ago'];
    }

    修改后的代码:

    if($seconds > 31536000) {
    return date('Y-n-j', $timestamp);
    } elseif($seconds > 2592000) {
    return date('n-j H:i', $timestamp);
    } elseif($seconds > 86400) {
    return date('n-j H:i', $timestamp);
    } elseif($seconds > 3600) {
    return date('n-j H:i', $timestamp);
    } elseif($seconds > 60) {
    return floor($seconds / 60).$lan['minute_ago'];
    } else {
    return $seconds.$lan['second_ago'];
    }
    第 2 条附言  ·  2018-10-30 20:23:19 +08:00
    首先感谢楼下各位的指点,让我知道显示时间格式的方法有好多种。

    1,原代码的 php date 函数;
    2,nesbot/carbon ;
    3,<script src="moment.js" />;

    由于本人小白,所以直接修改第一种方法,实现了“多少小时前”改为“多少小时多少分钟前”。多谢楼下各位指点。
    elseif($seconds > 3600) {
    return floor($seconds / 3600).'小时'.($seconds % 60).$lan['minute_ago'];
    }

    本帖结束。

    真相是:
    最终实现的思路是:
    1 年外,显示“年月日 时分”;
    1 年内,1 小时外,显示“月日 时分”
    1 小时内,显示多少分钟;
    1 分钟内,显示多少秒;

    再次感谢诸位。
    当然,也感谢我来自的那个论坛的网友指出了为什么会出现第二条附言的情况。

    真相只有一个,我改错了文件。虽然两个文件关于时间格式的代码一模一样。

    <very very big>完</ very very big>。
    27 条回复    2018-10-30 14:41:15 +08:00
    weirdo
        1
    weirdo  
       2018-10-29 18:00:32 +08:00
    composer require nesbot/carbon

    了解一下
    yibin001
        2
    yibin001  
       2018-10-29 18:05:33 +08:00   ❤️ 4
    歪哥楼,只有我觉得这样显示 xx 天、xx 小时、xx 分钟以前一点都不友好吗???
    maemolee
        3
    maemolee  
       2018-10-29 18:58:10 +08:00   ❤️ 1
    @yibin001 同意,我一直受不了这种时间表示法。尤其是翻短信的时候,太傻逼了。
    loading
        4
    loading  
       2018-10-29 18:59:36 +08:00 via Android
    @yibin001
    @maemolee
    我也觉得很傻。

    不能用作恶,不帮楼主了。233
    0ZXYDDu796nVCFxq
        5
    0ZXYDDu796nVCFxq  
       2018-10-29 19:02:06 +08:00 via Android
    求余几次
    6680101
        6
    6680101  
    OP
       2018-10-29 19:12:01 +08:00 via iPhone
    @weirdo
    多谢。瞄了一下,内容好多。
    6680101
        7
    6680101  
    OP
       2018-10-29 19:16:18 +08:00 via iPhone
    @loading
    净说大实话。让我咋办。

    各位爷,源代码能直接改成那样的格式吗?
    纯小白,PHP 没接触过啊,代码不是我写的。
    6680101
        8
    6680101  
    OP
       2018-10-29 19:21:45 +08:00 via iPhone
    @yibin001
    @maemolee
    从我的角度,如果改成具体的年月日时分秒格式,手机上太占空间了,排版不好看。我试过了。所以,想像 V2EX 这样显示。主要是话题讨论。对时间的准确性要求不高。
    6680101
        9
    6680101  
    OP
       2018-10-29 19:23:39 +08:00 via iPhone
    @gstqc
    Thanks.
    思路没错。
    遗憾的是我不懂写法。
    66beta
        10
    66beta  
       2018-10-29 20:04:38 +08:00 via Android
    这个不难吧,如果你要维护,还是学一下基本的编程吧...
    sobigfish
        11
    sobigfish  
       2018-10-29 20:10:21 +08:00
    v2ex 这么显示不友好的地方是只显示 time ago 的相对时间
    (不在其他方式下 显示绝对时间 比如移上去可以以 title 提示绝对时间)
    有可以显示的绝对时间的方式的我觉得还好
    6680101
        12
    6680101  
    OP
       2018-10-29 20:14:23 +08:00 via iPhone
    @66beta
    后面确实要学习一下 php。

    大哥,你别走。
    请问能通过直接修改上面的代码实现预期格式吗?
    不能的话,我再按照一楼大哥的线索去学习。

    我只是用别人的源码搭了一个网站玩玩。结果,或许以后竟然入了这一行。这也……
    yhxx
        13
    yhxx  
       2018-10-29 20:16:03 +08:00
    @yibin001
    +1
    x 秒前,x 分钟前还可以接受一下
    x 小时,x 天前简直不能忍
    kran
        14
    kran  
       2018-10-29 20:17:17 +08:00 via iPhone
    省略年份的更可恶,这种优化真是徒增烦恼
    doowzs
        15
    doowzs  
       2018-10-29 20:20:51 +08:00
    @weirdo
    carbon+1
    carbon ver2 超好用
    marcong95
        16
    marcong95  
       2018-10-29 22:28:00 +08:00 via Android
    其实你就这样把 x 分钟前的那段 elseif 拼到 x 小时前的那段不就好了么

    就是这个 i18n 的问题需要调整一下

    而且由于这段代码有 i18n 的相关代码,也不知道你只改这里会不会不太好
    6680101
        17
    6680101  
    OP
       2018-10-29 22:50:37 +08:00
    @marcong95
    多谢。请问是这样拼吗?汗.. 感觉应该没写对。

    } elseif($seconds > 3600) {
    return floor($seconds / 3600).$lan['hour'] floor($seconds-$seconds/3600*60).$lan['minute_ago'];
    } elseif($seconds > 60) {
    return floor($seconds / 60).$lan['minute_ago'];
    marcong95
        18
    marcong95  
       2018-10-30 00:19:55 +08:00
    @6680101 你似乎是完全没编程基础?感觉还是要先学一下,如果是公司项目急着要的话,比较简单的方法是

    } elseif($seconds > 3600) {
    return floor($seconds / 3600).'分钟'.floor($seconds-$seconds/3600*60).$lan['minute_ago'];
    } elseif($seconds > 60) {
    return floor($seconds / 60).$lan['minute_ago'];

    这个$lan 是一个关联数组,从你贴出来的代码看,里面并没有一个 hour 的项,所以$lan['hour']是取不出东西来的(而且还有可能报错,PHP 太久没碰了,我也不肯定)

    .(点)在 php 是把两个字符串拼起来
    marcong95
        19
    marcong95  
       2018-10-30 00:20:57 +08:00
    @6680101 当然这写法不好,有极大可能被各种鄙视。。。只是个应急写法
    feverzsj
        20
    feverzsj  
       2018-10-30 00:22:17 +08:00
    看来 lz 以前是搞人工智能的,这么多 if
    tankeco
        21
    tankeco  
       2018-10-30 00:31:28 +08:00
    咦,时间那么复杂,难道不是<script src="moment.js" />么....?
    6680101
        22
    6680101  
    OP
       2018-10-30 00:47:53 +08:00
    @marcong95
    非常感谢,我试试。

    @feverzsj
    哪里。lz 是做业务的。
    这个是别人写的程序里的一小段。我觉得挺厉害的。
    6680101
        23
    6680101  
    OP
       2018-10-30 00:55:01 +08:00
    @tankeco

    我又发现了新大陆。
    kba977
        24
    kba977  
       2018-10-30 09:10:28 +08:00 via iPhone
    这种活不应该直接交给 moment 么,一行代码的事
    weirdo
        25
    weirdo  
       2018-10-30 09:49:55 +08:00
    @6680101 直接 carbon 啊,用时间戳或者格式化的时间 new 一个 carbon 对象,然后调 diffForHumans 方法,直接就出来了
    realkaiway
        26
    realkaiway  
       2018-10-30 10:23:19 +08:00
    时间处理为什么不考虑下 Moment.js...
    6680101
        27
    6680101  
    OP
       2018-10-30 14:41:15 +08:00
    @kba977
    @weirdo
    @realkaiway
    @sobigfish

    感谢提供思路。回头我再读读。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:15 · PVG 12:15 · LAX 20:15 · JFK 23:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.