【问题标题】:How can I determine if a user has included a time in a single input/string?如何确定用户是否在单个输入/字符串中包含时间?
【发布时间】:2015-02-21 03:04:52
【问题描述】:

我要求用户在一个字段中输入会议说明。当用户在此输入中包含时间时,我想智能地猜测/解析,以使他们不必填写单独的时间输入字段。

Google 日历使用这种解析来预填充时间字段。

示例输入:

  • 2:30 在汉堡王见面 - 我想提取“2:30”并将其转换为日期/时间
  • Denny 的下午 2 点 - 我想退出“下午 2 点”
  • 1 在麦当劳 - 我想拿出“1”

如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 单个数字将是最难智能确定的。其余的你可以做各种正则表达式来解析/检查格式。
  • 我个人会用正则表达式来做这件事。
  • datejs 的东西也很酷.. 但就像我说的,1 位数的东西很难得到......你可以写“我想在 1 点在那里”,它不会检测到任何东西.因为你也可以写“我想买两部手机”......
  • 如果单个数字总是跟在/前面是“at”,那么这就更容易了

标签: javascript date datetime time


【解决方案1】:

我知道您需要 JS 解决方案,但我用 PHP 编写了一些代码,您可能想检查一下逻辑是否对您的项目有帮助。

<?php
$string1 = "Meet at Burger King at 2:30";
$string2 = "Denny's 2pm";
$string3 = "I want to buy 2 phones at 1";

print iterateString($string1).  "- It should return 2:30<br>";
print iterateString($string2). "- It should return 2pm<br>";
print iterateString($string3). "- It should return 1:00<br>";

function isTime($date, $formats=array("H:i","G:i","Ha","ha", "Ga", "ga")) {
    foreach($formats as $format) {
        $d = DateTime::createFromFormat($format, $date);
        $fd = $d ? $d->format($format) : false;

        if ($d && $fd == $date) {
            return $fd;
        }
    }
    return false;
}

function iterateString($string) {
    $singleTime = false;
    $words =  explode(" ",$string);
    foreach($words as $word) {
        if ($singleTime && ctype_digit($word)) {
            $word = $word . ":00";
        }

        if($time = isTime($word)) {
            return $time;
        }

        if($word == 'at') {
            $singleTime = true;
        } else {
            $singleTime = false;
        }
    }
    return "error";
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多