将AngularJS中的时间戳格式化为自定义要求

时间:2014-12-18 02:56:28

标签: javascript angularjs date datetime momentjs

我有一个从新帖子返回的数字字符串,在以new Date().getTime()格式提交时加上时间戳。我希望设置一个持续时间戳,例如(new Date().getTime() of submitted post - current date time)或基本上是从提交帖子后经过的日期时间。

如果<<<<<< 一个月的持续时间(但一个月的定义各不相同,有些2月有28天?)。不确定是否全球时区调整。如果是>一个月,将其显示为month (Jan, Mar, Dec etc)year 2014,例如没有任何持续时间。

我听说过片刻.JS但不确定是否有这样的定制以上。我应该如何处理转换?感谢是否有引用的示例代码。

非常感谢!

2 个答案:

答案 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以及本地化。