我有一个从新帖子返回的数字字符串,在以new Date().getTime()
格式提交时加上时间戳。我希望设置一个持续时间戳,例如(new Date().getTime() of submitted post - current date time)
或基本上是从提交帖子后经过的日期时间。
如果<<<<<< 一个月的持续时间(但一个月的定义各不相同,有些2月有28天?)。不确定是否全球时区调整。如果是>一个月,将其显示为month (Jan, Mar, Dec etc)
和year 2014
,例如没有任何持续时间。
我听说过片刻.JS但不确定是否有这样的定制以上。我应该如何处理转换?感谢是否有引用的示例代码。
非常感谢!
答案 0 :(得分:2)
我有一个从新Date()返回的数字字符串.getTime()
这将是一个单独的数字,表示自1970-01-01T00:00:00Z(ECMAScript纪元)以来的毫秒数以及代码执行的UTC时间。
并保存在后端。我希望将持续时间戳设置为(new Date()。getTime() - now())。
如果now()
是Date.now()
的简写,那么该表达式的结果将为零(0),因为两个表达式将代表同一时刻。
但是我希望过滤器将其显示为分钟,小时,几天前
将以毫秒为单位的值转换为天,小时,分钟,秒的值非常简单。
如果不到一个月(但是一个月的定义不同,2月有时会有28天?)我不确定时间戳字符串是否考虑了全局时区调整。
Date对象核心的时间值是自纪元以来的UTC毫秒。日期对象还具有根据系统设置确定的偏移量,用于计算本地时间值。有UTC方法可以获取UTC值,非UTC方法可以获取本地值。
如果超过一个月,将其显示为月份(1月,3月,12月等)和2014年,例如没有任何持续时间。
减去两个时间值的结果是一个标量数,它没有几个月或几年的概念,它只是表示一个持续时间,而不是一个时刻。所以将一个数字转换为"月"只有特定的起点(时代)和方向才有意义。
E.g。
1月1日+ 31天 - > 2月1日所以一个月,但是1月1日+ 31天 - > 7月2日所以1个月1天。
1月1日 - 31日 - > 12月1日所以一个月,以及6月1日 - 31天 - > 5月1日这样1个月。
我听说过时刻JS,但不确定是否有这样的定制持续时间
我对moment.js一无所知,只是因为我从未发现过它。
我应该如何处理转换?
首先澄清您的要求。也许您希望将持续时间表示为特定时间点(例如现在,或2014年6月1日,或其他)的月,日,小时等?
上面的一些是微不足道的,有些是非常困难的,取决于行政规则,例如:是2012年2月29日+ 1年2013年2月28日或2013年3月1日?
下面的示例代码是确定两个日期之间的年,月和日的相当可靠的方法。它也会在几小时:分钟:时间差小于1天的时间内(即8.64e7毫秒)。
它可能看起来像很多代码,其中很大一部分是在几年,几个月,几天内完成。
/**
* Return the number of days in the month for the given year.
* Month is calendar month (Jan=1, Feb=2, etc.).
* @param {number} [month]
* @param {number} [year]
* @returns {number}
* Default is current month, current year
*/
function getDaysInMonth(month, year) {
var d = new Date();
d.setHours(12,0,0,0);
if (typeof month == 'undefined') month = d.getMonth() + 1;
if (typeof year == 'undefined') year = d.getFullYear();
d.setFullYear(year, month, 0);
return d.getDate();
}
/**
* Add years to a given Date, modifies the Date.
* If adding years to 29 Feb rolls over to March 1,
* then the date is set to 28 Feb.
* @param {Date} date - Date to add years to
* @param {number} years - Number of years to add
* @returns {Date} Modified original date object
*/
function addYears(date, years) {
var m = date.getMonth();
date.setFullYear(date.getFullYear() + years);
// Deal with leap year: if 29 Feb -> 1 Mar set back to 28 Feb
if (date.getMonth() != m) {
date.setDate(0);
}
return date;
}
/**
* Add months to a given Date, modifies the Date.
* If adding months causes the date to roll over an extra month,
* the date is set to last day of previous month.
*
* e.g. 31 May + 1 month -> 30 June, not 1 July
* 31 Jan + 1 month -> 28 Feb or 29 Feb if leap year
* @param {Date} date - Date to add months to
* @param {number} months - Number of months to add
* @returns {Date} Modified original
*/
function addMonths(date, months) {
var n = date.getDate();
date.setMonth(date.getMonth() + months);
if (date.getDate() != n) {
date.setDate(0);
}
return date;
}
/**
* Add days to a given Date, modifies the Date.
* @param {Date} date - Date to add days to
* @param {number} days - Number of days to add
* @returns {Date} Modified original
*/
function addDays(date, days) {
date.setDate(date.getDate() + days);
return date;
}
/**
* Convert seconds to hh:mm:ss
* @param {number|string} secs
* @returns {number}
*/
function secondsToHMS(secs) {
function z(n){return (n<10?'0':'') + n;}
var sign = secs < 0? '-':'';
secs = Math.abs(secs);
return sign + z(secs/3600 |0) + ':' + z((secs%3600) / 60 |0) + ':' + z(secs%60);
}
/**
* Get the time between two dates as years, months and days.
* For startDate of 29 Feb, whole year is 28 Feb in following year or
* 29 Feb if endDate is a leap year. Some systems use 1 Mar.
* @param {Date} startDate
* @param {Date} [endDate]
* @returns {string} 'y years, m moths and d days'
* If endDate not provided, current date is used.
* endDate must be after startDate.
*/
function getAge(startDate, endDate) {
// Return undefined if start date is after end date
if (startDate > endDate) return;
var d, d0, d1, years, months, days;
var startMonth = startDate.getMonth();
d1 = endDate? new Date(+endDate) : new Date();
d1.setHours(0,0,0,0);
d = new Date(+startDate);
d.setHours(0,0,0,0);
d0 = new Date(+d);
years = d1.getFullYear() - d.getFullYear();
addYears(d, years);
if (d > d1) {
--years;
d = new Date(+d0);
addYears(d, years);
}
months = d1.getMonth() - d.getMonth();
// Deal with -ve month difference
if (months < 0) {
months += 12;
// Deal with months the same and difference < 1 year
} else if (months == 0 && d.getFullYear() != d1.getFullYear()) {
months = 11;
}
addMonths(d, months);
if (d > d1) {
--months;
d = new Date(+d0);
addYears(d, years);
addMonths(d, months);
}
days = d1.getDate() - d.getDate();
if (days < 0 ) {
days += getDaysInMonth(d.getMonth()+1, d.getFullYear());
} else if (days == 0 && d1.getMonth() != d.getMonth()) {
days = getDaysInMonth(d.getMonth()+1, d.getFullYear()) - 1;
}
// Helper to make words plural if num != 1
function s(num, word) {return word + (num == 1? '' : 's')}
return years + s(years, ' year' ) + ', ' +
months + s(months, ' month') + ', ' +
days + s(days, ' day' );
}
// Basic function to parse an ISO 8601 format string as a
// local time. Any timezone is ignored.
// Honours 2 digit years, so 14 is not 1914.
function parseString(s) {
var d = new Date();
b = s.split(/\D+/);
d.setFullYear(b[0], b[1] - 1, b[2]);
d.setHours(b[3] || 0, b[4] || 0, b[5]);
return d;
}
function showDuration() {
var el = document.getElementById('d0');
var now = new Date();
// Convert date string to a Date object
var then = parseString(document.getElementById('i0').value);
// If not a valid date, do nothing
if (!then) return;
// If difference greater than 1 day, show years, months, etc.
// Otherwise, show h:m:s
el.innerHTML = ((now - then) > 8.64e7? getAge(then, now) :
secondsToHMS(Math.abs(then - now)/1000 | 0)) + ' ago.';
}
一些加价:
<input id="i0" value="2014-06-23T20:28:09">
<button onclick="showDuration()">Show duration</button>
<br>
<div id="d0"></div>
答案 1 :(得分:2)
是的,你可以使用moment.js,它处理所有这些。您可以使用fromnow:
moment([2007, 0, 29]).fromNow(); // 4 years ago
如果你不喜欢它给你的东西,那就customizable:
moment.relativeTimeThreshold('d'); // 26
另见calendar,可自定义。
或者,您可以使用diff
a.diff(b,&#39; days&#39;)// 1
最后,您还可以使用duration
moment.duration(2, 'weeks');
要格式化显示方式,您可以使用format
moment().format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
它还支持时区和utc以及本地化。