使用Javascript将ISO时间戳转换为日期格式?

15

这似乎是一个很简单的问题,但我似乎找不到答案。如何使用JavaScript将ISO时间戳转换为日期/时间格式?

时间戳示例:2012-04-15T18:06:08-07:00

希望得到任何帮助,谷歌无法解决我的问题。谢谢。


可能是重复问题 https://dev59.com/U3RA5IYBdhLWcg3wvQhh - elclanrs
5
Unix时间戳和ISO时间戳并不相同,因此,不,它们不是重复的。 - Ian
你的ISO时间戳是一个字符串吗?你想将它解析成JavaScript的Date()类吗? - jfriend00
jfriend00,我在上面放了一个时间戳的示例2012-04-15T18:06:08-07:00。这正是我想要做的,我只想将该时间戳通过JavaScript运行,并以日期格式返回。类似于“Jan 1, 2010 12:00:21”(该时间戳实际上不会转换为该格式)。但是,我一直无法弄清楚如何使用iso时间戳来完成此操作。我知道如何在PHP中完成此操作,但我想在JavaScript中完成,以便相对于用户的时区。 - Ian
4个回答

29

1
那比我想象的容易得多了... 謝謝。 - Ian
6
这似乎无法在IE9之前的任何版本或Firefox 4之前的版本中运行。 - jfriend00
1
确实,解析 ISO 日期是支持 EcmaScript 5 的一部分。如果您需要使用旧版浏览器,最好使用以下代码之类的东西。 - eagleflo

4

最新版本的JavaScript(在一些最新的浏览器中为v1.85或更高版本)可以直接处理ISO日期,因此您可以直接将字符串传递给Date()构造函数,如下所示:

var jsDate = new Date("2012-04-15T18:06:08-07:00");

但是旧版浏览器(IE9之前的任何版本,Firefox 4之前的任何版本等)不支持此功能。对于这些浏览器,您可以使用类似datejs的库来实现,或者自己解析,例如:

var t = "2012-04-15T18:06:08-07:00";

function convertDate(t) {
    var dateRE = /(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+\-]\d+):(\d+)/;
    var match = t.match(dateRE);
    var nums = [], item, date;
    if (match) {
        for (var i = 1; i < match.length; i++) {
            nums.push(parseInt(match[i], 10));
        }
        if (nums[7] < 0) {
            nums[8] *= -1;
        }
        return(new Date(nums[0], nums[1] - 1, nums[2], nums[3] - nums[6], nums[4] - nums[7], nums[5]));
    }
}

var jsDate = convertDate(t);

这里有一个可行的演示: http://jsfiddle.net/jfriend00/QSgn6/

0

这是我目前看到的最好的,能够使用客户端桌面时区并随着时区设置实时更改的:

<script type="text/javascript">
    //Use: timeZoneConvert("2015-11-03T17:36:20.970");
    //Mon Nov 02 2015 17:36:20 GMT-0600 (Central Standard Time)  [Date object]

    //To format string use: timeZoneConvertFormatted("2015-11-03T17:36:20.970")
    //November 2, 2015 5:36 PM

    //Works even when I change client timezone to Pacific Standard
    //Mon Nov 02 2015 15:36:20 GMT-0800 (Pacific Standard Time)



var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
function timeZoneConvert(dateStr) {
    var d = parse_iso8601(dateStr);
    //Change (- 360) constant for your server, mine is Central Standard
    var dTimezoneOffset = new Date(d.getTime() - ((new Date()).getTimezoneOffset() - 360)*60000);
    return dTimezoneOffset;
}   

function timeZoneConvertFormatted(dateStr) {
    return fDateTime(timeZoneConvert(dateStr));
}   


function fDateTime(date1) {
    var date = date1.getDate();
    var year = date1.getFullYear();
    var month = months[date1.getMonth() + 1];
    var h = date1.getHours();
    var m = date1.getMinutes();
    var ampm = "AM";
    if(m < 10) {
        m = "0" + m;
    }
    if(h > 12) {
        h = h - 12;
        var ampm = "PM";
    }
    return month + " " + date + ", " + year + " " + h + ":" + m + " " + ampm;
}



    var iso8601extended = /^\d{4}(-\d{2}(-\d{2}([T ]\d{2}(:\d{2}(:\d{2})?)?([,.]\d+)?(Z|[+-]\d{2}(:\d{2})?)?)?)?)?$/;
    var iso8601basic = new RegExp(iso8601extended.source.replace(/[:-]\\d/g, '\\d'));
    var firstNumber = /[^\d]*(\d+)/g;
    function parse_iso8601(s) {
        s = s.replace(/,/g, '.');
        var matches = iso8601extended.exec(s);
        if (matches) {
            s = s.substr(0, 10).replace(/-/g, '') + s.substr(10).replace(/:/g, '');
        }
        matches = iso8601basic.exec(s);
        if (!matches) {
            return null;
        }
        var d = new Date();
        d.setUTCFullYear(toNumber(matches[0].substring(0, 4)));
        d.setUTCMonth(matches[1] ? toNumber(matches[1].substr(0, 2)) - 1 : 0);
        d.setUTCDate(matches[2] ? toNumber(matches[2].substr(0, 2)) : 1);
        var hours = 0, minutes = 0, seconds = 0, milliseconds = 0;
        var fraction = matches[6] ? parseFloat(matches[6]) : 0;
        if (matches[3]) {
            hours = toNumber(matches[3].substr(1, 2));
            if (matches[4]) {
                minutes = toNumber(matches[4].substr(0, 2));
                if (matches[5]) {
                    seconds = toNumber(matches[5].substr(0, 2));
                    milliseconds = 1000 * fraction;
                } else {
                    seconds = 60 * fraction;
                }
            } else {
                minutes = 60 * fraction;
            }
        }
        if (!matches[7]) {
            d.setHours(hours);
            d.setMinutes(minutes);
        } else {
            d.setUTCHours(hours);
            d.setUTCMinutes(minutes);
        }
        d.setUTCSeconds(seconds);
        d.setUTCMilliseconds(milliseconds);
        if (matches[7] && matches[7] != 'Z') {
            offset = toNumber(matches[7].substr(1, 2)) * 60;
            if (matches[8]) {
                 offset += toNumber(matches[8].substr(0, 2));
            }
            d.setTime(d.getTime() + 60000 * offset * (matches[7].substr(0, 1) == '-' ? 1 : -1));
        }
        return d;
    }
    function toNumber(s) {
        return parseInt(s.replace(/^0+(\d)/, '$1'));
    }
</script>

0
const now = new Date(); // create a new date object with the current time

// Here are some examples of what javascript provides:
console.log({
    now,
    toDateString: now.toDateString(),
    toISOString: now.toISOString(),
    toLocaleString: now.toLocaleString(),
    toLocaleDateString: now.toLocaleDateString(),
    toLocaleTimeString: now.toLocaleTimeString(),
    toUTCString: now.toUTCString(),
    toTimeString: now.toTimeString(),
})

这将打印:

[LOG]: {
  "now": "2022-08-02T10:29:26.891Z",
  "toDateString": "Tue Aug 02 2022",
  "toISOString": "2022-08-02T10:29:26.891Z",
  "toLocaleString": "02/08/2022, 11:29:26",
  "toLocaleDateString": "02/08/2022",
  "toLocaleTimeString": "11:29:26",
  "toUTCString": "Tue, 02 Aug 2022 10:29:26 GMT",
  "toTimeString": "11:29:26 GMT+0100 (British Summer Time)"
} 

或者,为了获得更多选项,您可以使用类似moment的东西。例如,我在这里使用它将日期转换为英国可读日期字符串:

import moment from "moment";

const now = new Date(); // create a new date object with the current time

const getTimeFormatted = (date: number) =>
  moment(date).format("DD/MM/yyyy hh:mm a");

console.log(getTimeFormatted(now)) // prints: 01/08/2022 11:29 am

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接