JavaScript Timespan控件

时间:2015-05-08 19:53:21

标签: javascript jquery angularjs datetime

我试图建立一个时间跨度控制。从本质上讲,它是一个控件,允许用户输入数年/月/日/小时的时间。

如果您曾经使用过JIRA,我认为他们可以很好地实现这一点。

jira

我感兴趣的是,是否有其他人有类似的案例以及您是如何通过控件进行的。另外,你如何在JavaScript中处理时间跨度(我在想milisecs)。

目标是创建一个控件,让用户轻松输入时间跨度。简单地输入3h之类的东西,2个不同的日期/时间控件非常混乱。

1 个答案:

答案 0 :(得分:1)

是的,将输入字符串解析为毫秒是一个好主意。所以你可以用它来做以后的计算。例如然后,您可以使用new Date(your-milliseconds)创建日期对象。

你可以在下面的演示和jsFiddle中找到一个指令。

它使用范围方法parseTime(time),它使用正则表达式来创建输入数组。所以你将在匹配的结果中有一个数字和关键字母。 然后,该字母将用于获取转换的时基,以毫秒为单位,该值是计算的乘数。

为了再次显示输入的时间跨度,我创建了一个过滤器,将毫秒转换回“周,天......”格式。

该演示工作得很好,但我认为有一点需要改进。如果在数字和字母之间输入空格,则无效。例如3 w 4 d 12h

但这可能很容易解决。它应该通过修剪解析方法中的空格来工作。

'use strict';

angular.module('myApp', []).
constant('formatObj', {
    "w": 7 * 24 * 60 * 60 * 1000, // milliseconds
    "d": 24 * 60 * 60 * 1000,
    "h": 60 * 60 * 1000,
    "m": 60 * 1000,
    "s": 1000,
    "ms": 1
})
    .controller('mainCtrl', function ($scope) {})
    .directive('timeSpanInput', function () {
    return {
        template: '<input ng-model="time" ng-change="parseTime(time)" ' +
            'placeholder="enter time..."></input>(e.g. 3w 4d 12h)<p ng-show="timespan">timespan entered {{timespan | dateSpan}}</p>',
        controller: function ($scope, $filter, formatObj) {
            $scope.parseTime = function (timeStr) {
                var pattern = /(\d+)(\w{1,2})/g, // returns 1w, 1, w from 1w string
                    match,
                    timespan = 0;

                while (match = pattern.exec(timeStr)) {
                    console.log(match); // index=1 value 2=format letter w d h s
                    if (match.length == 3 && isNaN(match[2])) {
                        timespan += match[1] * formatObj[match[2]];
                    }
                }
                //console.log(timespan);
                $scope.timespan = timespan;
            };
        }
    };
})
    .filter('dateSpan', function (formatObj) {
    return function (date) {
        // convert milli seconds to weeks days hours minutes seconds string
        if (angular.isUndefined(date)) return; // date not defined yet.

        var dateObj = {},      // created date obj {w: 3, d: 4, h:12}
            dateResult = date, // used to calculated times
            factor = 0,  // math factor millis to weeks, hours, etc.
            result = ''; // formatted result string

        for (var key in formatObj) {
            factor = formatObj[key];
            dateObj[key] = Math.floor(dateResult / factor);
            dateResult -= dateObj[key] * factor;
        }

        // console.log(dateObj);
        // generate output string
        for (var key in dateObj) {
            if (dateObj[key]) {
                result += (dateObj[key] + key + ' ');
            }
        };
        //console.log('res', result);
        return result;
    };
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
<div ng-app="myApp" ng-contoller="mainCtrl">
    <time-span-input></time-span-input>
</div>