151 lines
4.6 KiB
JavaScript
151 lines
4.6 KiB
JavaScript
// Copyright 2013 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
/**
|
|
* @fileoverview Functions for formatting duration values. Such as "3 days"
|
|
* "3 hours", "14 minutes", "2 hours 45 minutes".
|
|
*
|
|
*/
|
|
|
|
goog.provide('goog.date.duration');
|
|
|
|
goog.require('goog.i18n.DateTimeFormat');
|
|
goog.require('goog.i18n.MessageFormat');
|
|
|
|
|
|
/**
|
|
* Number of milliseconds in a minute.
|
|
* @type {number}
|
|
* @private
|
|
*/
|
|
goog.date.duration.MINUTE_MS_ = 60000;
|
|
|
|
|
|
/**
|
|
* Number of milliseconds in an hour.
|
|
* @type {number}
|
|
* @private
|
|
*/
|
|
goog.date.duration.HOUR_MS_ = 3600000;
|
|
|
|
|
|
/**
|
|
* Number of milliseconds in a day.
|
|
* @type {number}
|
|
* @private
|
|
*/
|
|
goog.date.duration.DAY_MS_ = 86400000;
|
|
|
|
|
|
/**
|
|
* Accepts a duration in milliseconds and outputs an absolute duration time in
|
|
* form of "1 day", "2 hours", "20 minutes", "2 days 1 hour 15 minutes" etc.
|
|
* @param {number} durationMs Duration in milliseconds.
|
|
* @return {string} The formatted duration.
|
|
*/
|
|
goog.date.duration.format = function(durationMs) {
|
|
var ms = Math.abs(durationMs);
|
|
|
|
// Handle durations shorter than 1 minute.
|
|
if (ms < goog.date.duration.MINUTE_MS_) {
|
|
/**
|
|
* @desc Duration time of zero minutes.
|
|
*/
|
|
var MSG_ZERO_MINUTES = goog.getMsg('0 minutes');
|
|
return MSG_ZERO_MINUTES;
|
|
}
|
|
|
|
var days = Math.floor(ms / goog.date.duration.DAY_MS_);
|
|
ms %= goog.date.duration.DAY_MS_;
|
|
|
|
var hours = Math.floor(ms / goog.date.duration.HOUR_MS_);
|
|
ms %= goog.date.duration.HOUR_MS_;
|
|
|
|
var minutes = Math.floor(ms / goog.date.duration.MINUTE_MS_);
|
|
|
|
// Localized number representations.
|
|
var daysText = goog.i18n.DateTimeFormat.localizeNumbers(days);
|
|
var hoursText = goog.i18n.DateTimeFormat.localizeNumbers(hours);
|
|
var minutesText = goog.i18n.DateTimeFormat.localizeNumbers(minutes);
|
|
|
|
// We need a space after the days if there are hours or minutes to come.
|
|
var daysSeparator = days * (hours + minutes) ? ' ' : '';
|
|
// We need a space after the hours if there are minutes to come.
|
|
var hoursSeparator = hours * minutes ? ' ' : '';
|
|
|
|
/**
|
|
* @desc The days part of the duration message: 1 day, 5 days.
|
|
*/
|
|
var MSG_DURATION_DAYS = goog.getMsg(
|
|
'{COUNT, plural, ' +
|
|
'=0 {}' +
|
|
'=1 {{TEXT} day}' +
|
|
'other {{TEXT} days}}');
|
|
/**
|
|
* @desc The hours part of the duration message: 1 hour, 5 hours.
|
|
*/
|
|
var MSG_DURATION_HOURS = goog.getMsg(
|
|
'{COUNT, plural, ' +
|
|
'=0 {}' +
|
|
'=1 {{TEXT} hour}' +
|
|
'other {{TEXT} hours}}');
|
|
/**
|
|
* @desc The minutes part of the duration message: 1 minute, 5 minutes.
|
|
*/
|
|
var MSG_DURATION_MINUTES = goog.getMsg(
|
|
'{COUNT, plural, ' +
|
|
'=0 {}' +
|
|
'=1 {{TEXT} minute}' +
|
|
'other {{TEXT} minutes}}');
|
|
|
|
var daysPart = goog.date.duration.getDurationMessagePart_(
|
|
MSG_DURATION_DAYS, days, daysText);
|
|
var hoursPart = goog.date.duration.getDurationMessagePart_(
|
|
MSG_DURATION_HOURS, hours, hoursText);
|
|
var minutesPart = goog.date.duration.getDurationMessagePart_(
|
|
MSG_DURATION_MINUTES, minutes, minutesText);
|
|
|
|
/**
|
|
* @desc Duration time text concatenated from the individual time unit message
|
|
* parts. The separator will be a space (e.g. '1 day 2 hours 24 minutes') or
|
|
* nothing in case one/two of the duration parts is empty (
|
|
* e.g. '1 hour 30 minutes', '3 days 15 minutes', '2 hours').
|
|
*/
|
|
var MSG_CONCATENATED_DURATION_TEXT = goog.getMsg(
|
|
'{$daysPart}{$daysSeparator}{$hoursPart}{$hoursSeparator}{$minutesPart}',
|
|
{
|
|
'daysPart': daysPart,
|
|
'daysSeparator': daysSeparator,
|
|
'hoursPart': hoursPart,
|
|
'hoursSeparator': hoursSeparator,
|
|
'minutesPart': minutesPart
|
|
});
|
|
|
|
return MSG_CONCATENATED_DURATION_TEXT;
|
|
};
|
|
|
|
|
|
/**
|
|
* Gets a duration message part for a time unit.
|
|
* @param {string} pattern The pattern to apply.
|
|
* @param {number} count The number of units.
|
|
* @param {string} text The string to use for amount of units in the message.
|
|
* @return {string} The formatted message part.
|
|
* @private
|
|
*/
|
|
goog.date.duration.getDurationMessagePart_ = function(pattern, count, text) {
|
|
var formatter = new goog.i18n.MessageFormat(pattern);
|
|
return formatter.format({'COUNT': count, 'TEXT': text});
|
|
};
|