Exciting news! TCMS official website is live! Offering full-stack software services including enterprise-level custom R&D, App and mini-program development, multi-system integration, AI, blockchain, and embedded development, empowering digital-intelligent transformation across industries. Visit dev.tekin.cn to discuss cooperation!
Across the six programming language implementations, the core logic for calculating human-readable time differences is consistent—with variations only in syntax and the use of time-processing libraries. Python code is concise and readable, suitable for rapid development and scripting; JavaScript is ideal for front-end or Node.js environments; PHP is commonly used for server-side development;

In many applications, displaying a human-readable time difference between two time points is a common requirement—such as showing the post time of messages on social platforms or recording event intervals in logging systems. This article details how to implement human-readable time difference calculation in six different programming languages (Python, JavaScript, PHP, Rust, Go, and Java), supporting both Chinese and English output and allowing users to choose whether to use "weeks" as a time unit.
The overall implementation approach is to first calculate the time difference between two time points (in seconds), then select the most appropriate time unit based on preset thresholds, and format the result into a human-readable string. The specific steps are as follows:
Calculate Time Difference : Obtain the time difference in seconds between the two time points.
Define Time Unit Thresholds : Define the second thresholds corresponding to different time units (e.g., year, month, week, day, hour, minute).
Select Appropriate Time Unit : Based on the time difference and thresholds, select the most suitable time unit and calculate the quantity in that unit.
Format Output : Combine the quantity and time unit into a human-readable string according to the user-selected language (Chinese or English).
from datetime import datetime
def human_readable_time_diff(
start_time: datetime,
end_time: datetime,
language: str = 'zh',
use_weeks: bool = True
) -> str:
"""
Calculate the human-readable time difference between two time points
:param start_time: Start time
:param end_time: End time
:param language: Output language ('zh' for Chinese/'en' for English)
:param use_weeks: Whether to use "week" as a time unit
:return: Human-readable time difference string
"""
# Calculate the time difference in seconds
delta = end_time - start_time
delta_seconds = abs(delta.total_seconds())
# Define time units with their corresponding seconds and thresholds
units = [
('year', 365 * 24 * 60 * 60, 365),
('month', 30 * 24 * 60 * 60, 30),
('week', 7 * 24 * 60 * 60, 7) if use_weeks else None,
('day', 24 * 60 * 60, 1),
('hour', 60 * 60, 1/24),
('minute', 60, 1/1440),
]
# Filter out None values to keep only valid time units
units = [u for u in units if u is not None]
# Iterate through units to find the appropriate one
for unit_info in units:
unit, seconds, _ = unit_info
if delta_seconds >= seconds:
# Calculate the quantity for the selected unit
count = int(delta_seconds // seconds)
return format_output(count, unit, language)
# If time difference is less than 1 minute, return corresponding result based on language
return '刚刚' if language == 'zh' else 'just now'
def format_output(count: int, unit: str, language: str) -> str:
"""Format the output string"""
if language == 'zh':
# Chinese time unit mapping
units_zh = {
'year': '年',
'month': '个月',
'week': '周',
'day': '天',
'hour': '小时',
'minute': '分钟'
}
return f"{count}{units_zh[unit]}前"
else:
# Handle English pluralization
unit_en = unit if count == 1 else f"{unit}s"
return f"{count} {unit_en} ago"
# Usage example
start = datetime(2024, 3, 20, 10, 0, 0)
end = datetime(2024, 3, 20, 11, 30, 0)
print(human_readable_time_diff(start, end)) # Output: 1小时前
print(human_readable_time_diff(start, end, language='en')) # Output: 1 hour ago
print(human_readable_time_diff(start, end, use_weeks=False)) # Output: 1小时前Time Complexity Analysis : The time complexity of the Python implementation is O (1). The length of the units list is fixed and does not change with input size. Traversing this list involves a constant number of operations to find the appropriate time unit, resulting in constant time complexity.
function humanReadableTimeDiff(startTime, endTime, language = 'zh', useWeeks = true) {
// Calculate the time difference in seconds
const deltaSeconds = Math.abs((endTime - startTime) / 1000);
// Define time units with their corresponding seconds and thresholds
const units = [
{ unit: 'year', seconds: 365 * 24 * 60 * 60, threshold: 365 },
{ unit: 'month', seconds: 30 * 24 * 60 * 60, threshold: 30 },
useWeeks ? { unit: 'week', seconds: 7 * 24 * 60 * 60, threshold: 7 } : null,
{ unit: 'day', seconds: 24 * 60 * 60, threshold: 1 },
{ unit: 'hour', seconds: 60 * 60, threshold: 1 / 24 },
{ unit: 'minute', seconds: 60, threshold: 1 / 1440 }
].filter(u => u !== null);
// Iterate through units to find the appropriate one
for (const unitInfo of units) {
if (deltaSeconds >= unitInfo.seconds) {
// Calculate the quantity for the selected unit
const count = Math.floor(deltaSeconds / unitInfo.seconds);
return formatOutput(count, unitInfo.unit, language);
}
}
// If time difference is less than 1 minute, return corresponding result based on language
return language === 'zh' ? '刚刚' : 'just now';
}
function formatOutput(count, unit, language) {
if (language === 'zh') {
// Chinese time unit mapping
const unitsZh = {
year: '年',
month: '个月',
week: '周',
day: '天',
hour: '小时',
minute: '分钟'
};
return `${count}${unitsZh[unit]}前`;
} else {
// Handle English pluralization
const unitEn = count === 1 ? unit : `${unit}s`;
return `${count} ${unitEn} ago`;
}
}
// Usage example
const start = new Date(2024, 2, 20, 10, 0, 0);
const end = new Date(2024, 2, 20, 11, 30, 0);
console.log(humanReadableTimeDiff(start, end));
console.log(humanReadableTimeDiff(start, end, 'en'));
console.log(humanReadableTimeDiff(start, end, 'zh', false));Time Complexity Analysis : The time complexity of the JavaScript implementation is also O (1). The length of the units array is fixed, and traversing it to find the appropriate time unit involves a constant number of operations regardless of input size.
// Function to calculate the human-readable time difference
function timeAgo(dateString) {
const lastUpdate = new Date(dateString);
const now = new Date();
const diffTime = now - lastUpdate; // Difference in milliseconds
const diffSeconds = Math.floor(diffTime / 1000);
const diffMinutes = Math.floor(diffSeconds / 60);
const diffHours = Math.floor(diffMinutes / 60);
const diffDays = Math.floor(diffHours / 24);
const diffMonths = Math.floor(diffDays / 30);
const diffYears = Math.floor(diffMonths / 12);
if (diffYears > 0) {
return diffYears === 1 ? '1 year ago' : `${diffYears} years ago`;
} else if (diffMonths > 0) {
return diffMonths === 1 ? '1 month ago' : `${diffMonths} months ago`;
} else if (diffDays > 0) {
return diffDays === 1 ? '1 day ago' : `${diffDays} days ago`;
} else if (diffHours > 0) {
return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;
} else if (diffMinutes > 0) {
return diffMinutes === 1 ? '1 minute ago' : `${diffMinutes} minutes ago`;
} else {
return 'just now';
}
}<?php
function humanReadableTimeDiff($startTime, $endTime, $language = 'zh', $useWeeks = true) {
// Calculate the time difference in seconds
$deltaSeconds = abs(strtotime($endTime) - strtotime($startTime));
// Define time units with their corresponding seconds and thresholds
$units = [
['unit' => 'year', 'seconds' => 365 * 24 * 60 * 60, 'threshold' => 365],
['unit' => 'month', 'seconds' => 30 * 24 * 60 * 60, 'threshold' => 30],
$useWeeks ? ['unit' => 'week', 'seconds' => 7 * 24 * 60 * 60, 'threshold' => 7] : null,
['unit' => 'day', 'seconds' => 24 * 60 * 60, 'threshold' => 1],
['unit' => 'hour', 'seconds' => 60 * 60, 'threshold' => 1 / 24],
['unit' => 'minute', 'seconds' => 60, 'threshold' => 1 / 1440]
];
// Filter out null values to keep only valid time units
$units = array_filter($units);
// Iterate through units to find the appropriate one
foreach ($units as $unitInfo) {
if ($deltaSeconds >= $unitInfo['seconds']) {
// Calculate the quantity for the selected unit
$count = floor($deltaSeconds / $unitInfo['seconds']);
return formatOutput($count, $unitInfo['unit'], $language);
}
}
// If time difference is less than 1 minute, return corresponding result based on language
return $language === 'zh' ? '刚刚' : 'just now';
}
function formatOutput($count, $unit, $language) {
if ($language === 'zh') {
// Chinese time unit mapping
$unitsZh = [
'year' => '年',
'month' => '个月',
'week' => '周',
'day' => '天',
'hour' => '小时',
'minute' => '分钟'
];
return $count . $unitsZh[$unit] . '前';
} else {
// Handle English pluralization
$unitEn = $count === 1 ? $unit : $unit . 's';
return $count . ' ' . $unitEn . ' ago';
}
}
// Usage example
$start = '2024-03-20 10:00:00';
$end = '2024-03-20 11:30:00';
echo humanReadableTimeDiff($start, $end) . "\n";
echo humanReadableTimeDiff($start, $end, 'en') . "\n";
echo humanReadableTimeDiff($start, $end, 'zh', false) . "\n";
?>Time Complexity Analysis : The time complexity of the PHP implementation is O (1). The length of the units array is fixed, and filtering and traversing it involve a constant number of operations independent of input size.
use chrono::{DateTime, Utc};
fn human_readable_time_diff(start_time: DateTime<Utc>, end_time: DateTime<Utc>, language: &str, use_weeks: bool) -> String {
// Calculate the time difference in seconds
let delta_seconds = (end_time - start_time).num_seconds().abs();
// Define time units with their corresponding seconds and thresholds
let units = [
("year", 365 * 24 * 60 * 60, 365),
("month", 30 * 24 * 60 * 60, 30),
if use_weeks { Some(("week", 7 * 24 * 60 * 60, 7)) } else { None },
("day", 24 * 60 * 60, 1),
("hour", 60 * 60, 1 / 24),
("minute", 60, 1 / 1440)
].into_iter().filter_map(|x| x).collect::<Vec<_>>();
// Iterate through units to find the appropriate one
for (unit, seconds, _) in units {
if delta_seconds >= *seconds {
// Calculate the quantity for the selected unit
let count = (delta_seconds / *seconds) as usize;
return format_output(count, unit, language);
}
}
// If time difference is less than 1 minute, return corresponding result based on language
if language == "zh" {
"刚刚".to_string()
} else {
"just now".to_string()
}
}
fn format_output(count: usize, unit: &str, language: &str) -> String {
if language == "zh" {
// Chinese time unit mapping
let units_zh = [
("year", "年"),
("month", "个月"),
("week", "周"),
("day", "天"),
("hour", "小时"),
("minute", "分钟")
];
let unit_zh = units_zh.iter().find(|(u, _)| *u == unit).unwrap().1;
format!("{}{}前", count, unit_zh)
} else {
// Handle English pluralization
let unit_en = if count == 1 {
unit.to_string()
} else {
format!("{}s", unit)
};
format!("{} {} ago", count, unit_en)
}
}
fn main() {
let start = Utc.ymd(2024, 3, 20).and_hms(10, 0, 0);
let end = Utc.ymd(2024, 3, 20).and_hms(11, 30, 0);
println!("{}", human_readable_time_diff(start, end, "zh", true));
println!("{}", human_readable_time_diff(start, end, "en", true));
println!("{}", human_readable_time_diff(start, end, "zh", false));
}Time Complexity Analysis : The time complexity of the Rust implementation is O (1). The vector derived from the units array has a fixed length, and traversing it involves a constant number of operations regardless of input size.
package main
import (
"fmt"
"time"
)
func humanReadableTimeDiff(startTime, endTime time.Time, language string, useWeeks bool) string {
// Calculate the time difference in seconds
deltaSeconds := int64(endTime.Sub(startTime).Seconds())
if deltaSeconds < 0 {
deltaSeconds = -deltaSeconds
}
// Define time units with their corresponding seconds and thresholds
units := []struct {
unit string
seconds int64
threshold float64
}{
{"year", 365 * 24 * 60 * 60, 365},
{"month", 30 * 24 * 60 * 60, 30},
{
"week", 7 * 24 * 60 * 60, 7,
},
{"day", 24 * 60 * 60, 1},
{"hour", 60 * 60, 1 / 24},
{"minute", 60, 1 / 1440},
}
// Remove week unit if not needed
if !useWeeks {
units = append(units[:2], units[3:]...)
}
// Iterate through units to find the appropriate one
for _, unitInfo := range units {
if deltaSeconds >= unitInfo.seconds {
// Calculate the quantity for the selected unit
count := deltaSeconds / unitInfo.seconds
return formatOutput(int(count), unitInfo.unit, language)
}
}
// If time difference is less than 1 minute, return corresponding result based on language
if language == "zh" {
return "刚刚"
}
return "just now"
}
func formatOutput(count int, unit string, language string) string {
if language == "zh" {
// Chinese time unit mapping
unitsZh := map[string]string{
"year": "年",
"month": "个月",
"week": "周",
"day": "天",
"hour": "小时",
"minute": "分钟",
}
return fmt.Sprintf("%d%s前", count, unitsZh[unit])
}
// Handle English pluralization
unitEn := unit
if count > 1 {
unitEn = fmt.Sprintf("%ss", unit)
}
return fmt.Sprintf("%d %s ago", count, unitEn)
}
func main() {
start := time.Date(2024, 3, 20, 10, 0, 0, 0, time.UTC)
end := time.Date(2024, 3, 20, 11, 30, 0, 0, time.UTC)
fmt.Println(humanReadableTimeDiff(start, end, "zh", true))
fmt.Println(humanReadableTimeDiff(start, end, "en", true))
fmt.Println(humanReadableTimeDiff(start, end, "zh", false))
}Time Complexity Analysis : The time complexity of the Go implementation is O (1). The length of the units slice is fixed (even after removing the week unit if needed), and traversing it involves a constant number of operations independent of input size.
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
class TimeDifferenceFormatter {
public static String humanReadableTimeDiff(LocalDateTime startTime, LocalDateTime endTime, String language, boolean useWeeks) {
// Calculate the time difference in seconds
Duration duration = Duration.between(startTime, endTime);
long deltaSeconds = Math.abs(duration.getSeconds());
// Define time units with their corresponding seconds and thresholds
List<TimeUnitInfo> units = new ArrayList<>();
units.add(new TimeUnitInfo("year", 365 * 24 * 60 * 60, 365));
units.add(new TimeUnitInfo("month", 30 * 24 * 60 * 60, 30));
if (useWeeks) {
units.add(new TimeUnitInfo("week", 7 * 24 * 60 * 60, 7));
}
units.add(new TimeUnitInfo("day", 24 * 60 * 60, 1));
units.add(new TimeUnitInfo("hour", 60 * 60, 1.0 / 24));
units.add(new TimeUnitInfo("minute", 60, 1.0 / (24 * 60)));
// Iterate through units to find the appropriate one
for (TimeUnitInfo unitInfo : units) {
if (deltaSeconds >= unitInfo.seconds) {
// Calculate the quantity for the selected unit
long count = deltaSeconds / unitInfo.seconds;
return formatOutput(count, unitInfo.unit, language);
}
}
// If time difference is less than 1 minute, return corresponding result based on language
return language.equals("zh") ? "刚刚" : "just now";
}
private static String formatOutput(long count, String unit, String language) {
if (language.equals("zh")) {
// Chinese time unit mapping
String[] unitsZh = {"年", "个月", "周", "天", "小时", "分钟"};
String[] unitNames = {"year", "month", "week", "day", "hour", "minute"};
for (int i = 0; i < unitNames.length; i++) {
if (unitNames[i].equals(unit)) {
return count + unitsZh[i] + "前";
}
}
} else {
// Handle English pluralization
String unitEn = count == 1 ? unit : unit + "s";
return count + " " + unitEn + " ago";
}
return "";
}
static class TimeUnitInfo {
String unit;
long seconds;
double threshold;
TimeUnitInfo(String unit, long seconds, double threshold) {
this.unit = unit;
this.seconds = seconds;
this.threshold = threshold;
}
}
public static void main(String[] args) {
LocalDateTime start = LocalDateTime.of(2024, 3, 20, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2024, 3, 20, 11, 30, 0);
System.out.println(humanReadableTimeDiff(start, end, "zh", true));
System.out.println(humanReadableTimeDiff(start, end, "en", true));
System.out.println(humanReadableTimeDiff(start, end, "zh", false));
}
}Time Complexity Analysis : The time complexity of the Java implementation is O (1). The length of the units list is fixed, and traversing it involves a constant number of operations regardless of input size.
Across the six programming language implementations, the core logic for calculating human-readable time differences is consistent—with variations only in syntax and the use of time-processing libraries. Python code is concise and readable, suitable for rapid development and scripting; JavaScript is ideal for front-end or Node.js environments; PHP is commonly used for server-side development; Rust is known for its high performance and safety; Go excels in concurrent processing and network programming; and Java is widely adopted in enterprise-level development due to its cross-platform capabilities and robust ecosystem. All six implementations have a time complexity of O (1), ensuring high efficiency for time difference calculations without significant performance degradation as input size increases. You can choose the appropriate language and implementation based on your project requirements.