在JavaScript中将字符串转换为日期


668

如何在JavaScript中将字符串转换为日期?

var st = "date in some format"
var dt = new date();

var dt_st= //st in date format same as dt


1
哦,我现在很困惑。你要Date -> String还是String -> Date
Felix Kling

10
考虑一下momentjs.com
hanshenrik

Answers:


827

字符串解析的最佳字符串格式是日期ISO格式以及JavaScript Date对象构造函数。

ISO格式的示例:YYYY-MM-DDYYYY-MM-DDTHH:MM:SS

可是等等! 仅仅使用“ ISO格式”本身不能可靠地工作。字符串有时会解析为UTC,有时会解析为本地时间(基于浏览器供应商和版本)。最佳做法应始终是将日期存储为UTC并进行计算为UTC。

要将日期解析为UTC,请附加Z-例如:new Date('2011-04-11T10:20:30Z')

要以UTC显示日期,请使用.toUTCString()
以使用用户当地时间显示日期.toString()

有关更多信息 MDN的 | 日期这个答案

为了与旧版本的Internet Explorer兼容(小于9的IE版本在Date构造函数中不支持ISO格式),应将datetime字符串表示形式拆分为各个部分,然后可以使用带datetime部分的构造函数,例如: new Date('2011', '04' - 1, '11', '11', '51', '00')。请注意,月份数必须少1。


替代方法-使用适当的库:

您还可以利用Moment.js库,该库允许解析具有指定时区的日期。


对于保罗·汤姆布林(Pau​​l Tomblin)提出的同一“南”问题,我也不得不对野生动物园使用“分割字符串”方法。new Date('2011-04-11 11:51:00')将返回“无效日期”。
阿莫斯(Amos)2014年

1
@Amos:注意字母T,它分隔日期和时间。如果写入,new Date('2011-04-11T11:51:00')则创建的日期有效。
Pavel Hodek 2014年

不幸的是,我遇到了*并非对所有用户都有效的问题
Roman Podlinov

3
让Date解析字符串是创建Date对象的最差方法。更好地手动解析字符串并将Date作为构造函数调用。某些浏览器会将没有时区的ISO字符串视为UTC,而其他浏览器会将其视为本地。
RobG

6
@Ben Taliadoros:是的,它在所有常见的浏览器中new Date('1970-30-02')都是无效的,并且是无效的日期,因为一年中没有30个月。您不会溢出数月,但是当您溢出数天时,它将在ChromeFirefox中解析为有效日期:new Date('1970-02-30')与新日期(“ 1970-03-02”)位于同一天。
帕维尔·霍德克

291

不幸的是我发现

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

返回“ 2014年4月2日星期三”。我知道这听起来很疯狂,但是某些用户会遇到这种情况。

防弹解决方案如下:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());


45
一点也不疯狂,这种调整很可能是由DST引起的。格式为的日期yyyy-MM-dd被解析为UTC和toString返回本地时间,因此根据用户时区,它肯定可以返回不同的结果。如果始终希望将时间设置为UTC,则应使用toUTCString
詹姆斯

一直在敲我的头。这似乎可行,但是我不明白为什么您使用part [0] -1而不是仅使用part [0]。
Adam Youngers'3

4
@AdamYoungers是因为JavaScript数个月从0:1 - 0,二月- 1,等等
罗马Podlinov

1
此答案表明该示例中的行为是不正确的。按照规范:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…(请参阅:datestring)示例中的输出值是正确的
James Ross

124
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

输出将是:

dt => Date {Fri Apr 26 2013}

5
不幸的是,该解决方案存在问题。详情点击此处:stackoverflow.com/questions/17959660/...
罗马Podlinov

输出是未知的,因为您的代码既不会将任何内容转换为字符串,也不会输出任何内容。
罗伯·西默

81
function stringToDate(_date,_format,_delimiter)
{
            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;
}

stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

3
处理各种变化的日期,而不仅仅是美国格式
Mark Jones,

4
@MarkJones不信任该.indexOf()方法,因为如果没有polyfils,该方法将不兼容跨浏览器。而是使用更兼容的.match().test()原始的JS方法。
亚历山大·迪克森

1
var _delimiter = _format.match(/\W/g)[0];在函数的开头添加您可以自动获取定界符并预输入第3个参数。
campsjos

39

moment.js(http://momentjs.com/)是一个使用日期完整且不错的软件包,并支持ISO 8601字符串

您可以添加字符串日期和格式。

moment("12-25-1995", "MM-DD-YYYY");

您可以检查日期是否有效。

moment("not a real date").isValid(); //Returns false

一些显示示例

let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL')) 
// output: "3 months ago | February 1, 2019"

请参阅文档 http://momentjs.com/docs/#/parsing/string-format/

建议:我建议对包含很多格式的日期使用一个包,因为时区和格式时间管理确实是一个大问题,而js解决了很多格式。您可以轻松地从一个简单的字符串至今解析日期,但我认为要支持日期的所有格式和变体是一项艰巨的工作。


1
一些显示示例的 let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))输出:“ 3个月前| 2019年2月1日”
CPHPython

36

将其作为参数传递给Date():

var st = "date in some format"
var dt = new Date(st);

您可以使用,例如访问日期,月份,年份:dt.getMonth()


8
console.log(new Date('30-08-2018'))得到无效日期
Dwigh

这个答案忽略了这个问题的多重复杂性,例如,如果我01/02/2020在计算机上(在英国)对某个日期执行此操作,它将返回2月1日,而好像在美国做同样的事情,它将返回1月2日。您应该几乎永远不要使用这种幼稚的实现。请改用
利亚姆

23

如果您可以使用出色的时刻库(例如在Node.js项目中),则可以使用以下方式轻松解析日期

var momentDate = moment("2014-09-15 09:00:00");

并可以通过访问JS日期对象

momentDate ().toDate();

5
请注意,没有节点,此刻效果很好
shaheer 2015年

使用此代码时,我的android和IOS设备中出现NaN错误,但是它在桌面上运行。这是我之前使用的代码:var dateTimeOfTimeIn = new Date(year +“-” + month +“-” + day +“ T” + data.timeIn); 使用这种方法和时刻库,我的问题得以解决,并且我的代码现在在所有设备上都能正常工作!
Mehdi

20

new Date(2000, 10, 1) 会给您“ 2000年11月1日星期三00:00:00 GMT + 0100(CET)”

看到0代表您一月


19

对于那些正在寻求纤巧解决方案的人:

String.prototype.toDate = function(format)
{
  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
};

例:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");

奇迹般有效!你救了我的命!
史蒂夫·诺塞


12

如果要从“ dd / MM / yyyy”格式转换。这是一个例子:

var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

此解决方案在低于9的IE版本中有效。


12

时间戳记应转换为数字

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date

1
怎么样的undefined价值?喜欢:var date = new Date(undefined)
Benny Neugebauer

@BennyNeugebauer会在尝试将值传递给Date构造函数之前先检查它是否未定义。也许您想抛出一个异常,或者您想要回退到默认日期,谁知道呢?
Lucky Soni

9

Date.parse几乎可以得到您想要的东西。它在am/ pm部分上令人窒息,但是您可以通过一些技巧使其正常工作:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) {
    timestamp += 12 * 60 * 60 * 1000;
}

6

转换为pt-BR格式:

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) {

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

    } else {
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    }

希望对某人有所帮助!!!



4

为了在js中将字符串转换为日期,我使用 http://momentjs.com/

moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours

1
默认情况下,moment()需要当前日期。如何使用矩来格式化“ 2016-06-27 17:49:51.951602 + 05:30”格式的字符串。
Zoran777 '16

4

我进行了此功能,以将任何Date对象转换为UTC Date对象。

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());

3

还有另一种方法:

String.prototype.toDate = function(format) {
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) {
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) {
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        }
    }
    return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z

啊! 整齐!最后,一个代码将处理使用的任何分隔符。
山姆·西里

3

您可以尝试以下方法:

function formatDate(userDOB) {
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `${day} ${monthNames[monthIndex]} ${year}`;
}

console.log(formatDate('1982-08-10'));


2
var date = new Date(year, month, day);

要么

var date = new Date('01/01/1970');

格式为'01 -01-1970'的日期字符串在FireFox中不起作用,因此最好在日期格式字符串中使用“ /”代替“-”。


我的字符串是“ 2015/08/03 13:06:16”,在FF中无效,无法正常工作
Dhara,

2

如果需要在转换为日期格式之前检查字符串的内容,请执行以下操作:

// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
  var d = mdy.split(/[\/\-\.]/, 3);

  if (d.length != 3) return null;

  // Check if date is valid
  var mon = parseInt(d[0]), 
      day = parseInt(d[1]),
      year= parseInt(d[2]);
  if (d[2].length == 2) year += 2000;
  if (day <= 31 && mon <= 12 && year >= 2015)
    return new Date(year, mon - 1, day);

  return null; 
}

2

我创建了parseDateTime函数以将字符串转换为日期对象,并且该函数在所有浏览器(包括IE浏览器)中都有效,请检查是否有人需要,请参阅 https://github.com/Umesh-Markande/Parse-String-to-Date在所有浏览器中

    function parseDateTime(datetime) {
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) {
                    hours += 12;
                    try{  time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
                } 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime.split(' ').length == 2){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime != ''){
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            }
            return datetime;
        }

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)

这个为我工作。谢谢。
克里斯·艾默生

2

该答案基于Kassem的答案,但它也处理两位数的年份。我对Kassem的答案进行了修改,但如果未获批准,我也将其作为单独的答案提交。

function stringToDate(_date,_format,_delimiter) {
        var formatLowerCase=_format.toLowerCase();
        var formatItems=formatLowerCase.split(_delimiter);
        var dateItems=_date.split(_delimiter);
        var monthIndex=formatItems.indexOf("mm");
        var dayIndex=formatItems.indexOf("dd");
        var yearIndex=formatItems.indexOf("yyyy");
        var year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100) { year += 2000; }
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;
}

stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

1

您可以使用正则表达式解析字符串以详细说明时间,然后创建日期或任何返回格式,例如:

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString){
    let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;
}
alert(strToDate(dateString));

1

性能

今天(2020.05.08)我对选定的解决方案进行测试-两种情况:输入日期为ISO8601字符串(Ad,Bd,Cd,Dd,Ed),输入日期为时间戳(At,Ct,Dt)。解决方案Bd,Cd,Ct不会将js Date对象作为结果返回,但是我添加它们是因为它们可能有用,但是我没有将它们与有效的解决方案进行比较。此结果对于大量的日期解析很有用。

结论

  • new Date对于ISO日期和时间戳的所有浏览器,(Ad)的速度比moment.js(Dd)快50-100倍
  • 解决方案new Date(Ad)的速度是其的10倍左右parseDate(Ed)
  • Date.parse如果需要在所有浏览器上从ISO日期获取时间戳,解决方案(Bd)最快

在此处输入图片说明

细节

我在Chrome 81.0,Safari 13.1,Firefox 75.0的MacOs High Sierra 10.13.6上执行测试。解决方案parseDate(Ed)使用new Date(0)并手动设置UTC日期组件。

铬的结果

在此处输入图片说明


0

像ISO 8601这样的日期字符串,尽管其标准出色,但仍未得到广泛支持。

这是确定要使用哪种日期字符串格式的好资源:

http://dygraphs.com/date-formats.html

是的,这意味着您的日期字符串可能与

"2014/10/13 23:57:52" 代替 "2014-10-13 23:57:52"


0
                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

0

使用此代码:(我的问题已通过此代码解决)

function dateDiff(date1, date2){
var diff = {}                           // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

}


3
请解释您的答案
Mazz

date1和date2参数必须具有正确的日期格式。
Fetra

该函数返回日期名为diff。如果您想返回的天数就是这样:var result = dateDiff(date1,date2); var day_number = result.day; 很容易
Fetra

0

当我从服务器获取日期字符串时,我编写了一个可重用的函数。
您可以传递所需的分隔符(/-等。),分隔日期和年份,以便使用split()方法。
您可以在此工作示例中看到并对其进行测试。

<!DOCTYPE html>
<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div>
      <span>day:
      </span> 
      <span id='day'>
      </span>
    </div>
    <div>
      <span>month:
      </span> 
      <span id='month'>
      </span>
    </div>
    <div>
      <span>year:
      </span> 
      <span id='year'>
      </span>
    </div>
    <br/>
    <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
    <span>28/10/1980
    </span>
    <script>
      function convert(delimiter,dateString)
      {
        var splitted = dateString.split('/');
        // create a new date from the splitted string 
        var myDate = new Date(splitted[2],splitted[1],splitted[0]);
        // now you can access the Date and use its methods 
        document.getElementById('day').innerHTML = myDate.getDate();
        document.getElementById('month').innerHTML = myDate.getMonth();
        document.getElementById('year').innerHTML = myDate.getFullYear();
      }
    </script>
  </body>
</html>

0

另一种方法是使用格式字符串上的命名捕获组构建一个正则表达式,然后使用该正则表达式从日期字符串中提取日,月和年:

function parseDate(dateStr, format) {
  const regex = format.toLocaleLowerCase()
    .replace(/\bd+\b/, '(?<day>\\d+)')
    .replace(/\bm+\b/, '(?<month>\\d+)')
    .replace(/\by+\b/, '(?<year>\\d+)')
  
  const parts = new RegExp(regex).exec(dateStr) || {};
  const { year, month, day } = parts.groups || {};
  return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}

const printDate = x => console.log(x ? x.toLocaleDateString() : x);

printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format


很好的解决方案,但你也许不知道,火狐仍然不支持正则表达式命名组- bugzilla.mozilla.org/show_bug.cgi?id=1362154(PS:这不是我是谁downvoted你的答案)
qdev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.