PHP/Python/js/Golang/Java:时间转为人类可读的字符串格式:刚刚、几分钟前、几小时前、几天前

简介: PHP/Python/js/Golang/Java:时间转为人类可读的字符串格式:刚刚、几分钟前、几小时前、几天前

时间转换为为刚刚、几分钟前、几小时前、几天前,有两种思路:

例如

2000-01-01 23:00:00  (需要格式化的时间)
2000-01-02 01:00:00   (此刻)

1、按照天、时、分逐个比较:不看时分秒,就是1天前

2、按照时间戳毫秒之差:要看时分秒,就是2小时前

为了更精确,本例采用 方式2:按照时间戳毫秒之差 的思路实现

目录

PHP 代码实现

<?php
/**
 * @param $time_value int|string 时间戳
 * @return false|string
 *
 * 时间格式化为:
 * 刚刚
 * 1分钟前-56分钟前
 * 1小时前-23小时前
 * 1天前-7天前
 * 2022-10-09 13:33
 */
function timeForHuman($time_value)
{
    // 兼容传入字符串
    if (is_string($time_value)) {
        $time_value = strtotime($time_value);
    }
    $second = 1;
    $minute = $second * 60;
    $hour   = $minute * 60;
    $day    = $hour * 24;
    $day_8  = $day * 8;
    $now_time = time();
    $duration = $now_time - $time_value;
    if ($duration < $minute) {
        return '刚刚';
    } else if ($duration < $hour) {
        return floor($duration / $minute) . '分钟前';
    } elseif ($duration < $day) {
        return floor($duration / $hour) . '小时前';
    } else if ($duration < $day_8) {
        return floor($duration / $day) . '天前';
    } else {
        return date("Y-m-d H:i", $time_value);
    }
}

测试示例

$now_time = time();
$now_str  = date('Y-m-d H:i:s', $now_time);
echo $now_time . PHP_EOL;
// 1665381270
echo $now_str . PHP_EOL;
// 2022-10-10 13:54:30
echo timeForHuman($now_time) . PHP_EOL;
// 刚刚
echo timeForHuman($now_str) . PHP_EOL;
// 刚刚
echo timeForHuman('2022-10-10 13:33:11') . PHP_EOL;
// 21分钟前

JavaScript实现版本

/**
 * 格式化时间为人类可读的字符串格式
 * @param {number|string|Date} time_value 13位时间戳
 * @returns {string}
 *
 * 时间格式化为:
 * 刚刚
 * 1分钟前-56分钟前
 * 1小时前-23小时前
 * 1天前-7天前
 * 2022-10-09 13:33
 */
function timeForHuman(time_value) {
  // 兼容其他类型的参数
  if (typeof time_value != 'number') {
    time_value = Date.parse(time_value)
  }
  // 进制转换
  let millisecond = 1
  let second = millisecond * 1000
  let minute = second * 60
  let hour = minute * 60
  let day = hour * 24
  let day_8 = day * 8
  now_time = Date.now()
  duration = now_time - time_value
  if (duration < minute) {
    return '刚刚'
  } else if (duration < hour) {
    return Math.floor(duration / minute) + '分钟前'
  } else if (duration < day) {
    return Math.floor(duration / hour) + '小时前'
  } else if (duration < day_8) {
    return Math.floor(duration / day) + '天前'
  } else {
    let date = new Date(time_value)
    return [
      [
        date.getFullYear(),
        ('0' + (date.getMonth() + 1)).slice(-2),
        ('0' + date.getDate()).slice(-2),
      ].join('-'),
      [
        ('0' + date.getHours()).slice(-2),
        ('0' + date.getMinutes()).slice(-2),
      ].join(':'),
    ].join(' ')
  }
}

测试

console.log(new Date());
// 2022-10-12T02:45:06.286Z
console.log(timeForHuman(new Date()))
// 刚刚
console.log(timeForHuman(1635476685643))
// 2021-10-29 11:04
console.log(timeForHuman('2021-10-29T03:04:45.640Z'))
// 2021-10-29 11:04
console.log(timeForHuman('2022-10-12'))
// 2小时前

Python实现版本

import time
from datetime import datetime
import math
DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
DATETIME_SHORT_FORMAT = "%Y-%m-%d %H:%M"
def time_for_human(time_value):
    """
    格式化时间为人类可读的字符串格式
    :param time_value: {int|string|datetime} time_value 10位时间戳
    :return: string
    时间格式化为:
    刚刚
    1分钟前-56分钟前
    1小时前-23小时前
    1天前-7天前
    2022-10-09 13:33
    """
    second = 1
    minute = second * 60
    hour = minute * 60
    day = hour * 24
    day_8 = day * 8
    if isinstance(time_value, datetime):
        time_value = time_value.timestamp()
    if isinstance(time_value, str):
        time_value = time.mktime(time.strptime(time_value, DATETIME_FORMAT))
    now_time = int(time.time())
    duration = now_time - time_value
    if duration < minute:
        return '刚刚'
    elif duration < hour:
        return str(math.floor(duration / minute)) + '分钟前'
    elif duration < day:
        return str(math.floor(duration / hour)) + '小时前'
    elif duration < day_8:
        return str(math.floor(duration / day)) + '天前'
    else:
        return time.strftime(DATETIME_SHORT_FORMAT, time.localtime(time_value))    

示例

print(time_for_human(1665381270))
# 2天前
print(time_for_human(datetime.now()))
# 刚刚
print(time_for_human(time.time() - 100))
# 1分钟前
print(time_for_human('2022-10-10 13:33:11'))
# 2天前

Golang代码实现

package timeutil
import (
  "fmt"
  "time"
)
// 格式化
const DATE_LAYOUT = "2006-01-02"
// 以秒为基本单位的时间枚举常量
const (
  SECOND = 1
  MINUTE = SECOND * 60
  HOUR   = MINUTE * 60
  DAY    = HOUR * 24
  DAY_8  = DAY * 8
)
/**
* 格式化日期
* timeValue 10位时间戳
 */
func TimeForHuman(timeValue int64) string {
  nowTime := time.Now().Unix()
  diffTime := nowTime - timeValue
  if diffTime <= MINUTE {
    return "刚刚"
  } else if diffTime < HOUR {
    return fmt.Sprintf("%d分钟前", int(diffTime/MINUTE))
  } else if diffTime <= DAY {
    return fmt.Sprintf("%d小时前", int(diffTime/HOUR))
  } else if diffTime <= DAY_8 {
    return fmt.Sprintf("%d天前", int(diffTime/DAY))
  } else {
    return time.Unix(timeValue, 0).Format(DATE_LAYOUT)
  }
}

测试代码

package timeutil
import (
  "fmt"
  "testing"
  "time"
)
func TestTimeForHuman(t *testing.T) {
  ret1 := TimeForHuman(time.Now().Unix() - 3*SECOND)
  fmt.Println(ret1)
  ret2 := TimeForHuman(time.Now().Unix() - 3*MINUTE)
  fmt.Println(ret2)
  ret3 := TimeForHuman(time.Now().Unix() - 3*HOUR)
  fmt.Println(ret3)
  ret4 := TimeForHuman(time.Now().Unix() - 3*DAY)
  fmt.Println(ret4)
  ret5 := TimeForHuman(time.Now().Unix() - 3*DAY_8)
  fmt.Println(ret5)
}

输出

$ go test
刚刚
3分钟前
3小时前
3天前
2023-01-23
PASS
ok      timeutil        0.005s

Java代码实现

package com.example;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeUtil {
    public final static long SECOND = 1000;
    public final static long MINUTE = SECOND * 60;
    public final static long HOUR = MINUTE * 60;
    public final static long DAY = HOUR * 24;
    /**
     * 将13位时间戳转为人类可读的字符串形式
     *
     * @param timeValue 将13位时间戳
     * @return
     */
    public static String timeForHuman(long timeValue) {
        long now = System.currentTimeMillis();
        long duration = now - timeValue;
        if (duration <= MINUTE) {
            return "刚刚";
        } else if (duration < HOUR) {
            return String.format("%d分钟前", (int) (duration / MINUTE));
        } else if (duration < DAY) {
            return String.format("%d小时前", (int) (duration / HOUR));
        } else if (duration < DAY * 8) {
            return String.format("%d天前", (int) (duration / DAY));
        } else {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            return formatter.format(new Date(timeValue));
        }
    }
}

测试

package com.example;
import org.junit.Test;
public class TimeUtilTests {
    @Test
    public void timeForHuman() {
        long now = System.currentTimeMillis();
        String ret1 = TimeUtil.timeForHuman(now - 3 * TimeUtil.SECOND);
        System.out.println(ret1);
        // 刚刚
        String ret2 = TimeUtil.timeForHuman(now - 3 * TimeUtil.MINUTE);
        System.out.println(ret2);
        // 3分钟前
        String ret3 = TimeUtil.timeForHuman(now - 3 * TimeUtil.HOUR);
        System.out.println(ret3);
        // 3小时前
        String ret4 = TimeUtil.timeForHuman(now - 3 * TimeUtil.DAY);
        System.out.println(ret4);
        // 3天前
        String ret5 = TimeUtil.timeForHuman(now - 8 * TimeUtil.DAY);
        System.out.println(ret5);
        // 2023-02-08
    }
}


相关文章
|
19天前
|
移动开发 自然语言处理 Linux
Python中r前缀:原始字符串的魔法解析
本文深入解析Python中字符串的r前缀(原始字符串)的设计原理与应用场景。首先分析传统字符串转义机制的局限性,如“反斜杠地狱”问题;接着阐述原始字符串的工作机制,包括语法定义、与三引号结合的用法及特殊场景处理。文章重点探讨其在正则表达式、文件路径和多语言文本处理中的核心应用,并分享动态构建、混合模式编程等进阶技巧。同时纠正常见误区,展望未来改进方向,帮助开发者更好地理解和使用这一特性,提升代码可读性和维护性。
39 0
|
25天前
|
数据采集 监控 数据安全/隐私保护
Python正则表达式:用"模式密码"解锁复杂字符串
正则表达式是处理字符串的强大工具,本文以Python的`re`模块为核心,详细解析其原理与应用。从基础语法如字符类、量词到进阶技巧如贪婪匹配与预定义字符集,结合日志分析、数据清洗及网络爬虫等实战场景,展示正则表达式的强大功能。同时探讨性能优化策略(如预编译)和常见错误解决方案,帮助开发者高效掌握这一“瑞士军刀”。最后提醒,合理使用正则表达式,避免过度复杂化,追求简洁优雅的代码风格。
48 0
|
1月前
|
PHP 开发者
PHP数据验证方法:如何检查一个字符串是否是email格式。
以上就是关于PHP如何检查一个字符串是否是email格式的全部内容。希望你在代码书写旅途中,能找到你的北斗星——简洁、高效、可靠的代码验证方式。让我们共同见证PHP的强大和丰富多彩!
56 16
|
3月前
|
索引 Python
python字符串类型及操作
本文主要讲解字符串类型的表示、操作符、处理函数、处理方法及格式化。内容涵盖字符串的定义、表示方法(单双引号、三引号)、索引与切片、特殊字符转义、常见操作符(如+、*、in等)、处理函数(如len()、str()、chr()等)、处理方法(如.lower()、.split()等)以及格式化方式(如.format())。通过实例代码详细介绍了字符串的各种用法和技巧,帮助读者全面掌握字符串操作。
112 2
python字符串类型及操作
|
2月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
|
3月前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。 isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。
|
4月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
63 0
|
2月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
2月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
99 28
|
2月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。