Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
875 lars 1
function strtotime (str, now) {
2
 
3
    // Convert string representation of date and time to a timestamp
4
    //
5
    // version: 1109.2015
6
    // discuss at: http://phpjs.org/functions/strtotime    // +   original by: Caio Ariede (http://caioariede.com)
7
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
8
    // +      input by: David
9
    // +   improved by: Caio Ariede (http://caioariede.com)
10
    // +   improved by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Wagner B. Soares
11
    // +   bugfixed by: Artur Tchernychev
12
    // %        note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
13
    // *     example 1: strtotime('+1 day', 1129633200);
14
    // *     returns 1: 1129719600    // *     example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
15
    // *     returns 2: 1130425202
16
    // *     example 3: strtotime('last month', 1129633200);
17
    // *     returns 3: 1127041200
18
    // *     example 4: strtotime('2009-05-04 08:30:00');    // *     returns 4: 1241418600
19
    var i, match, s, strTmp = '',
20
        parse = '';
21
 
22
    strTmp = str;    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
23
    strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars
24
    if (strTmp == 'now') {
25
        return (new Date()).getTime() / 1000; // Return seconds, not milli-seconds
26
    } else if (!isNaN(parse = Date.parse(strTmp))) {        return (parse / 1000);
27
    } else if (now) {
28
        now = new Date(now * 1000); // Accept PHP-style seconds
29
    } else {
30
        now = new Date();    }
31
 
32
    strTmp = strTmp.toLowerCase();
33
 
34
    var __is = {        day: {
35
            'sun': 0,
36
            'mon': 1,
37
            'tue': 2,
38
            'wed': 3,            'thu': 4,
39
            'fri': 5,
40
            'sat': 6
41
        },
42
        mon: {            'jan': 0,
43
            'feb': 1,
44
            'mar': 2,
45
            'apr': 3,
46
            'may': 4,            'jun': 5,
47
            'jul': 6,
48
            'aug': 7,
49
            'sep': 8,
50
            'oct': 9,            'nov': 10,
51
            'dec': 11
52
        }
53
    };
54
     var process = function (m) {
55
        var ago = (m[2] && m[2] == 'ago');
56
        var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
57
 
58
        switch (m[0]) {        case 'last':
59
        case 'next':
60
            switch (m[1].substring(0, 3)) {
61
            case 'yea':
62
                now.setFullYear(now.getFullYear() + num);                break;
63
            case 'mon':
64
                now.setMonth(now.getMonth() + num);
65
                break;
66
            case 'wee':                now.setDate(now.getDate() + (num * 7));
67
                break;
68
            case 'day':
69
                now.setDate(now.getDate() + num);
70
                break;            case 'hou':
71
                now.setHours(now.getHours() + num);
72
                break;
73
            case 'min':
74
                now.setMinutes(now.getMinutes() + num);                break;
75
            case 'sec':
76
                now.setSeconds(now.getSeconds() + num);
77
                break;
78
            default:                var day;
79
                if (typeof(day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
80
                    var diff = day - now.getDay();
81
                    if (diff == 0) {
82
                        diff = 7 * num;                    } else if (diff > 0) {
83
                        if (m[0] == 'last') {
84
                            diff -= 7;
85
                        }
86
                    } else {                        if (m[0] == 'next') {
87
                            diff += 7;
88
                        }
89
                    }
90
                    now.setDate(now.getDate() + diff);                }
91
            }
92
            break;
93
 
94
        default:            if (/\d+/.test(m[0])) {
95
                num *= parseInt(m[0], 10);
96
 
97
                switch (m[1].substring(0, 3)) {
98
                case 'yea':                    now.setFullYear(now.getFullYear() + num);
99
                    break;
100
                case 'mon':
101
                    now.setMonth(now.getMonth() + num);
102
                    break;                case 'wee':
103
                    now.setDate(now.getDate() + (num * 7));
104
                    break;
105
                case 'day':
106
                    now.setDate(now.getDate() + num);                    break;
107
                case 'hou':
108
                    now.setHours(now.getHours() + num);
109
                    break;
110
                case 'min':                    now.setMinutes(now.getMinutes() + num);
111
                    break;
112
                case 'sec':
113
                    now.setSeconds(now.getSeconds() + num);
114
                    break;                }
115
            } else {
116
                return false;
117
            }
118
            break;        }
119
        return true;
120
    };
121
 
122
    match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);    if (match != null) {
123
        if (!match[2]) {
124
            match[2] = '00:00:00';
125
        } else if (!match[3]) {
126
            match[2] += ':00';        }
127
 
128
        s = match[1].split(/-/g);
129
 
130
        for (i in __is.mon) {            if (__is.mon[i] == s[1] - 1) {
131
                s[1] = i;
132
            }
133
        }
134
        s[0] = parseInt(s[0], 10);
135
        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20' + (s[0] < 10 ? '0' + s[0] : s[0] + '') : (s[0] >= 70 && s[0] <= 99) ? '19' + s[0] : s[0] + '';
136
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2]) + (match[4] ? match[4] / 1000 : ''), 10);
137
    }
138
     var regex = '([+-]?\\d+\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)' + '|(last|next)\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))' + '(\\sago)?';
139
 
140
    match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i'
141
    if (match == null) {
142
        return false;    }
143
 
144
    for (i = 0; i < match.length; i++) {
145
        if (!process(match[i].split(' '))) {
146
            return false;        }
147
    }
148
 
149
    return (now.getTime() / 1000);
150
}