From f26420638c9b69e63f0d81163c458f2f6882df77 Mon Sep 17 00:00:00 2001 From: lixulun Date: Fri, 5 Jun 2026 18:01:19 +0800 Subject: [PATCH] add ,timestamp CLI tool for time conversion and relative time display --- ,timestamp | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 ,timestamp diff --git a/,timestamp b/,timestamp new file mode 100755 index 0000000..cc93d4e --- /dev/null +++ b/,timestamp @@ -0,0 +1,92 @@ +#!/usr/bin/env ruby + +require 'time' + +def format_relative_time(seconds) + return "刚刚" if seconds.abs < 60 + + is_past = seconds > 0 + suffix = is_past ? "前" : "后" + abs_seconds = seconds.abs.to_i + + if abs_seconds >= 365 * 24 * 60 * 60 + years = abs_seconds / (365 * 24 * 60 * 60) + "#{years}年#{suffix}" + elsif abs_seconds >= 30 * 24 * 60 * 60 + months = abs_seconds / (30 * 24 * 60 * 60) + "#{months}个月#{suffix}" + elsif abs_seconds >= 7 * 24 * 60 * 60 + weeks = abs_seconds / (7 * 24 * 60 * 60) + "#{weeks}周#{suffix}" + elsif abs_seconds >= 24 * 60 * 60 + days = abs_seconds / (24 * 60 * 60) + "#{days}天#{suffix}" + elsif abs_seconds >= 60 * 60 + hours = abs_seconds / (60 * 60) + "#{hours}小时#{suffix}" + elsif abs_seconds >= 60 + minutes = abs_seconds / 60 + "#{minutes}分钟#{suffix}" + else + "#{abs_seconds}秒#{suffix}" + end +end + +def process_timestamp(input) + ts = input.to_i + + # 智能识别:如果是 13 位数字,认为是毫秒;如果是 10 位,认为是秒 + # 如果数字范围在合理的时间戳范围内,也可以判断 + if ts.to_s.length == 13 + time = Time.at(ts / 1000.0) + elsif ts.to_s.length == 10 + time = Time.at(ts) + elsif ts > 1_000_000_000_000 + # 超过这个值的可能是毫秒级时间戳(约 2001 年之后) + time = Time.at(ts / 1000.0) + else + time = Time.at(ts) + end + + now = Time.now + relative = format_relative_time(now - time) + + puts "时间: #{time.strftime('%Y-%m-%d %H:%M:%S')}" + puts "相对时间: #{relative}" +end + +def process_iso8601(input) + time = Time.parse(input) + now = Time.now + relative = format_relative_time(now - time) + ms_timestamp = (time.to_f * 1000).to_i + + puts "本地时间: #{time.strftime('%Y-%m-%d %H:%M:%S')}" + puts "时区: #{time.strftime('%z')}" + puts "UTC 时间: #{time.getutc.strftime('%Y-%m-%d %H:%M:%S')}" + puts "相对时间: #{relative}" + puts "毫秒时间戳: #{ms_timestamp}" +end + +def main + if ARGV.empty? + puts "用法: ,timestamp <时间戳|ISO8601时间>" + puts "" + puts "示例:" + puts " ,timestamp 1717584000" + puts " ,timestamp 1717584000000" + puts " ,timestamp 2024-06-05T12:00:00Z" + puts " ,timestamp 2024-06-05T12:00:00+08:00" + exit 1 + end + + input = ARGV[0].strip + + if input =~ /^\d+$/ + process_timestamp(input) + else + process_iso8601(input) + end +end + +main