【问题标题】:change time string of HH:mm am/pm to 24 hour time将 HH:mm am/pm 的时间字符串更改为 24 小时制
【发布时间】:2013-07-15 21:21:18
【问题描述】:

我得到一个像这样的变量字符串:

上午 8 点 45 分

如果是下午,则希望将其转换为 24 小时制。这样我就可以放下 am/pm 并将其与其他东西一起使用。

我可以像这样轻松删除上午/下午:

function replaceEnds(string) {
        string = string.replace("am", "");
        string = string.replace("pm", "");
        return string;
    }

但当然,如果我这样做,我不知道字符串是上午还是下午,所以我不知道在字符串上添加 12 小时以使其成为 24 小时。

有人知道我该如何解决这个问题吗?我绝对不能更改从变量中获得的输入,它始终是小时(以 12 小时为单位)、分钟和上午或下午。

【问题讨论】:

    标签: javascript date time


    【解决方案1】:

    不使用任何额外的 JavaScript 库:

    /**
     * @var amPmString - Time component (e.g. "8:45 PM")
     * @returns - 24 hour time string
     */
    function getTwentyFourHourTime(amPmString) { 
        var d = new Date("1/1/2013 " + amPmString); 
        return d.getHours() + ':' + d.getMinutes(); 
    }
    

    例如:

    getTwentyFourHourTime("8:45 PM"); // "20:45"
    getTwentyFourHourTime("8:45 AM"); // "8:45"
    

    【讨论】:

      【解决方案2】:

      使用moment.js

      moment(string, 'h:mm a').format('H:mm');
      

      如果你想手动完成,这将是我的解决方案:

      function to24Hour(str) {
          var tokens = /([10]?\d):([0-5]\d) ([ap]m)/i.exec(str);
          if (tokens == null) { return null; }
          if (tokens[3].toLowerCase() === 'pm' && tokens[1] !== '12') {
              tokens[1] = '' + (12 + (+tokens[1]));
          } else if (tokens[3].toLowerCase() === 'am' && tokens[1] === '12') {
              tokens[1] = '00';
          }
          return tokens[1] + ':' + tokens[2];
      }
      

      手动解决方案更难理解,不够灵活,缺少一些错误检查并且需要单元测试。一般来说,您通常应该更喜欢经过良好测试的流行库的解决方案,而不是您自己的解决方案(如果有经过良好测试的库)。

      【讨论】:

        【解决方案3】:

        如果您正在寻找将 ANY FORMAT 正确转换为 24 小时 HH:MM 的解决方案。

        function get24hTime(str){
            str = String(str).toLowerCase().replace(/\s/g, '');
            var has_am = str.indexOf('am') >= 0;
            var has_pm = str.indexOf('pm') >= 0;
            // first strip off the am/pm, leave it either hour or hour:minute
            str = str.replace('am', '').replace('pm', '');
            // if hour, convert to hour:00
            if (str.indexOf(':') < 0) str = str + ':00';
            // now it's hour:minute
            // we add am/pm back if striped out before 
            if (has_am) str += ' am';
            if (has_pm) str += ' pm';
            // now its either hour:minute, or hour:minute am/pm
            // put it in a date object, it will convert to 24 hours format for us 
            var d = new Date("1/1/2011 " + str);
            // make hours and minutes double digits
            var doubleDigits = function(n){
                return (parseInt(n) < 10) ? "0" + n : String(n);
            };
            return doubleDigits(d.getHours()) + ':' + doubleDigits(d.getMinutes());
        }
        
        console.log(get24hTime('6')); // 06:00
        console.log(get24hTime('6am')); // 06:00
        console.log(get24hTime('6pm')); // 18:00
        console.log(get24hTime('6:11pm')); // 18:11
        console.log(get24hTime('6:11')); // 06:11
        console.log(get24hTime('18')); // 18:00
        console.log(get24hTime('18:11')); // 18:11
        

        【讨论】:

          【解决方案4】:

          我用过类似的东西

          //time is an array of [hh] & [mm am/pm] (you can get this by time = time.split(":");
          function MilitaryTime(time){
          if(time[1].indexOf("AM")!=-1){
          //its in the morning, so leave as is
            return time;
          }else if(time[0]!="12"){
          //If it is beyond 12 o clock in the after noon, add twelve for military time.
            time[0]=String(parseInt(time[0])+12);
            return time;
          }
          else{
          return time;
          }
          }
          

          返回时间后,您可以随意更改文本。

          【讨论】:

          • 此解决方案不考虑上午 12:00 -> 00:00,并且 parseInt 将在旧浏览器(例如 firefox 3.6)上失败,输入为 '09'。见jsfiddle.net/j2xc6/1。 -> 点击小提琴上的 jshint 按钮看看为什么。
          • 啊,该死!这就是我从内存中编码时发生的情况。谢谢你的收获,下次会记住的。
          猜你喜欢
          • 1970-01-01
          • 2018-01-21
          • 2020-04-23
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          • 2014-06-12
          • 2018-07-20
          • 2013-09-09
          相关资源
          最近更新 更多