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

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

  •  1
     
  •   6680101 · 175 天前 · 2472 次点击
    这是一个创建于 175 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网站默认的时间格式,是“多少小时前”,觉得太单薄,想像 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 条附言  ·  175 天前
    参照#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 条附言  ·  174 天前
    首先感谢楼下各位的指点,让我知道显示时间格式的方法有好多种。

    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
        1
    weirdo   175 天前
    composer require nesbot/carbon

    了解一下
        2
    yibin001   175 天前   ♥ 4
    歪哥楼,只有我觉得这样显示 xx 天、xx 小时、xx 分钟以前一点都不友好吗???
        3
    maemolee   175 天前   ♥ 1
    @yibin001 同意,我一直受不了这种时间表示法。尤其是翻短信的时候,太傻逼了。
        4
    loading   175 天前 via Android
    @yibin001
    @maemolee
    我也觉得很傻。

    不能用作恶,不帮楼主了。233
        5
    gstqc   175 天前 via Android
    求余几次
        6
    6680101   175 天前 via iPhone
    @weirdo
    多谢。瞄了一下,内容好多。
        7
    6680101   175 天前 via iPhone
    @loading
    净说大实话。让我咋办。

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

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

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

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

    而且由于这段代码有 i18n 的相关代码,也不知道你只改这里会不会不太好
        17
    6680101   175 天前
    @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'];
        18
    marcong95   175 天前
    @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 是把两个字符串拼起来
        19
    marcong95   175 天前
    @6680101 当然这写法不好,有极大可能被各种鄙视。。。只是个应急写法
        20
    feverzsj   175 天前
    看来 lz 以前是搞人工智能的,这么多 if
        21
    tankeco   175 天前
    咦,时间那么复杂,难道不是<script src="moment.js" />么....?
        22
    6680101   175 天前
    @marcong95
    非常感谢,我试试。

    @feverzsj
    哪里。lz 是做业务的。
    这个是别人写的程序里的一小段。我觉得挺厉害的。
        23
    6680101   175 天前
    @tankeco

    我又发现了新大陆。
        24
    kba977   175 天前 via iPhone
    这种活不应该直接交给 moment 么,一行代码的事
        25
    weirdo   175 天前
    @6680101 直接 carbon 啊,用时间戳或者格式化的时间 new 一个 carbon 对象,然后调 diffForHumans 方法,直接就出来了
        26
    realkaiway   174 天前
    时间处理为什么不考虑下 Moment.js...
        27
    6680101   174 天前
    @kba977
    @weirdo
    @realkaiway
    @sobigfish

    感谢提供思路。回头我再读读。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4504 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 39ms · UTC 02:18 · PVG 10:18 · LAX 19:18 · JFK 22:18
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1