用Javascript或Ruby将epoch时间转换为十进制年份



示例:格林尼治标准时间2016年1月20日星期三12:00:01 AM=1453248001=>2016.0533

就是这样,准确无误:

Time.at(1453248001).then { |t| t.year + t.yday / 365.25 }

准确地说,第二个有点麻烦

Time.at(1453248001).then do |t|
beginning_of_year = Time.utc("#{t.year}-01-01")
seconds_in_year = Time.utc("#{t.year + 1}-01-01") - beg_of_year
num_seconds = t - beginning_of_year
t.year + num_seconds / seconds_in_year
end

给定以秒为单位的时间值,年份的小数部分由给出

(supplied_time - year_start_time) / seconds_in_year

例如

// Return decimal UTC year given a time value in seconds
// e.g. 1453248001 (2016-01-20T00:00:01Z) = 2016.0519125999292
function decimalYear(tv) {
let d = new Date(tv * 1e3);
let y = d.getUTCFullYear();
let start = Date.UTC(y, 0, 1);   // Start of UTC year
let end = Date.UTC(y + 1, 0, 1); // Start of following UTC year
return y + (d - start) / (end - start);
}
// Time values in seconds
[Date.UTC(2016, 0, 1, 0, 0, 0)/1e3|0, // 2016-01-01T00:00:00Z
Date.UTC(2016, 0, 1, 0, 0, 1)/1e3|0, // 2016-01-01T00:00:01Z
Date.UTC(2016, 0,20, 0, 0, 1)/1e3|0, // 2016-01-20T00:00:01Z
Date.UTC(2016,11,31,23,59,59)/1e3|0, // 2016-12-31T23:59:59Z
Date.UTC(2017, 0, 1, 0, 0, 0)/1e3|0  // 2017-01-01T00:00:00Z
].forEach(tv => console.log(tv + ' => ' + decimalYear(tv)));

无论时间值是否在闰年,使用通用公式都可以得到准确的结果。

OP中的示例不正确:

示例:GMT 2016年1月20日星期三12:00:01 AM=1453248001=>2016.0533

以下所有时间均为UTC秒:

  • 2016-01-12T00:00:01Z的时间值为1453248001
  • 2016年初为1451606400
  • 2016年底(即2017年初(为1483228800
  • (timeValue-startOfYear(÷(endOfYear-startOfYear(=0.0519125999292

最新更新