将用户给定日期(2017 年 1 月或 01.2 月 1 日)转换为时间戳
Convert user given date (January or 01. February 2017) to a timestamp
我正在尝试将用户输入的日期解析为 MySQL 时间戳格式 (YYYY-MM-DD)。
用户输入可能类似于:
input - wanted conversion
1) January - ThisYear-01-01, ThisYear-01-31
2) February 2017 - 2017-02-01, 2017-02-28
3) 01. April 2016 - 2016-04-01
4) 5.4.15 - 2015-04-05
P.S.:
上面的示例是我们希望支持的建议格式(仅支持其中一些也可以)。
用户不是随机的或国际的,他们将始终以这种格式(日月年)书写和理解日期。
处理缺失的年份条目或零(如#4 中的 5/4)不是问题,但要找到一种正确的方法来处理提到的可能的日期输入格式(DD MM YY、DD MM、DD Month) , Month, Month YY, DD Month YY.....等等)加上一些看起来不太丑的东西,而且代码很长,我有点难以想象。
P.S.:
D,DD,MM,YY,YYYY是数字输入的缩写
月份是单词输入变体。
能否请您告诉我是否有什么可以帮助我使这个过程 easier/more 可读或至少为我指明正确的方向?
谢谢
更新 #1:
通过再次查看我上面的问题,我发现它缺少一些背景信息,但我不想对其进行详细描述,而只是对想要的功能进行描述。对不起。
下面是关于该计划的一些一般信息:
该程序是一个用 C# (UWP) 编写的聊天机器人,它接受自然语言的用户请求并从 mySQL 数据库(数据库基于 OSTicket 支持系统)返回请求的信息(如果被识别)。
在内部,我们将用户输入发送到 LUIS.ai 以使其得到识别,然后我们从服务中取回意图和实体,然后将其解析为 SQL 查询并将其发送到D B。
然后将来自数据库的结果发送回用户。
许多已解析的查询工作得很好,这就是为什么我现在想通过让用户在请求中提供特定日期来扩展它(例如,给我所有四月份的支持票)。
我只想获取这个新输入 "April" 并将其转换为 MySQL 时间戳格式,这样它也可以从 MySQL.
中识别出来
我目前的方法是像这样构建一个字符串:
string convertedTS = year + "-" + month + "-" + day;
并使用 3 个函数尝试检测所有三个变量。但现在就是这样。
例如"give me all the tickets from April":
四月(从 LUIS AI 识别为给定日期)将转换为 (04)
年份将从
开始
DateTime.Today.Year
也插入了 (2018-04)
第一天始终是 01,该月的最后一天将是:
DateTime.Today.Year
示例的最终查询:
select ..........between '2018-04-01' AND '2017-04-30'
如果您担心格式化年、月、日等,那您就错了。您有 C#,并且有来自用户的日期字符串。您关心的是将该字符串放入 C# DateTime 值中。 MySql 与此无关。
获得 DateTime 值后,让您的连接提供商担心通过参数化查询进行格式化:
DateTime d = GetMyDateTimeValueFromUser();
string sql = "pretend SQL comnand with a datetime @variable";
using (var cn = new MySqlConnection("connection string here"))
using (var cmd = new MySqlCommand(sql, cn))
{
cmd.Parameters.Add("@variable", MySqlDbType.Timestamp).Value = d;
cn.Open();
//pick one.
cmd.ExecuteReader();
cmd.ExecuteNonQuery();
}
不需要特殊的 SQL 格式。 如果您没有使用参数化查询,您就做错了! 这不仅仅适用于 DateTime 值。在 SQL 语句中使用的 所有 数据都应该这样处理。这具有超出简单日期值的安全和性能影响。 Go parameters, or go home(我的意思是:回家。不要写不好的代码。我们不再需要了。)
由于它适用于问题,这意味着问题完全关于将字符串解析为 C# DateTime 值。将此数据移动到 SQL 的下一步只是不相关。值得庆幸的是,.Net 在这里为您提供了一些选择。具体来说,看一下 Parse 函数族,包括:
DateTime.Parse()
DateTime.TryParse()
DateTime.ParseExact()
DateTime.TryParseExact()
后两者允许您指定组 允许的格式,这些格式可以匹配系统实际看到的格式。 NuGet 可以成为该领域的进一步资源。
你说那是什么?您想允许用户输入 任何内容 吗?那是行不通的。时期。真正的人类可以 并且将 想出比你可能处理过的更多的方法来输入日期。更不用说当英国公民将值 1/2/2018 输入您的系统时您需要知道该怎么做,因为该人几乎肯定认为这意味着 2018 年 2 月 1 日,而 不是 1 月 2 日。像这样的文化差异意味着如果前端没有某种上下文输入过滤器,就不可能接受日期输入。您 必须 查看您的用户界面以帮助您的用户创建您的代码将理解的值...但是我们在问题中没有足够的信息来提供该领域的任何指导。
为了在我的程序中使用它,我修复了它。
现在我可以检测并理解这样的输入:
“2008 年 9 月 11 日”
《2017》
"today"
"yesterday"
“2002 年 9 月 11 日”
"march 2017"
“2010 年 1 月 1 日”
“01-01-2010”
“2019 年 5 月 1 日”
“31.October 2020”
“4 月 1 日”
"december"
如果有人也有兴趣编写类似的功能,请发表评论,因为代码将近 300 行。
我正在尝试将用户输入的日期解析为 MySQL 时间戳格式 (YYYY-MM-DD)。 用户输入可能类似于:
input - wanted conversion 1) January - ThisYear-01-01, ThisYear-01-31 2) February 2017 - 2017-02-01, 2017-02-28 3) 01. April 2016 - 2016-04-01 4) 5.4.15 - 2015-04-05
P.S.: 上面的示例是我们希望支持的建议格式(仅支持其中一些也可以)。 用户不是随机的或国际的,他们将始终以这种格式(日月年)书写和理解日期。
处理缺失的年份条目或零(如#4 中的 5/4)不是问题,但要找到一种正确的方法来处理提到的可能的日期输入格式(DD MM YY、DD MM、DD Month) , Month, Month YY, DD Month YY.....等等)加上一些看起来不太丑的东西,而且代码很长,我有点难以想象。
P.S.:
D,DD,MM,YY,YYYY是数字输入的缩写
月份是单词输入变体。
能否请您告诉我是否有什么可以帮助我使这个过程 easier/more 可读或至少为我指明正确的方向?
谢谢
更新 #1: 通过再次查看我上面的问题,我发现它缺少一些背景信息,但我不想对其进行详细描述,而只是对想要的功能进行描述。对不起。
下面是关于该计划的一些一般信息: 该程序是一个用 C# (UWP) 编写的聊天机器人,它接受自然语言的用户请求并从 mySQL 数据库(数据库基于 OSTicket 支持系统)返回请求的信息(如果被识别)。
在内部,我们将用户输入发送到 LUIS.ai 以使其得到识别,然后我们从服务中取回意图和实体,然后将其解析为 SQL 查询并将其发送到D B。 然后将来自数据库的结果发送回用户。
许多已解析的查询工作得很好,这就是为什么我现在想通过让用户在请求中提供特定日期来扩展它(例如,给我所有四月份的支持票)。 我只想获取这个新输入 "April" 并将其转换为 MySQL 时间戳格式,这样它也可以从 MySQL.
中识别出来我目前的方法是像这样构建一个字符串:
string convertedTS = year + "-" + month + "-" + day;
并使用 3 个函数尝试检测所有三个变量。但现在就是这样。
例如"give me all the tickets from April": 四月(从 LUIS AI 识别为给定日期)将转换为 (04) 年份将从
开始DateTime.Today.Year
也插入了 (2018-04) 第一天始终是 01,该月的最后一天将是:
DateTime.Today.Year
示例的最终查询:
select ..........between '2018-04-01' AND '2017-04-30'
如果您担心格式化年、月、日等,那您就错了。您有 C#,并且有来自用户的日期字符串。您关心的是将该字符串放入 C# DateTime 值中。 MySql 与此无关。
获得 DateTime 值后,让您的连接提供商担心通过参数化查询进行格式化:
DateTime d = GetMyDateTimeValueFromUser();
string sql = "pretend SQL comnand with a datetime @variable";
using (var cn = new MySqlConnection("connection string here"))
using (var cmd = new MySqlCommand(sql, cn))
{
cmd.Parameters.Add("@variable", MySqlDbType.Timestamp).Value = d;
cn.Open();
//pick one.
cmd.ExecuteReader();
cmd.ExecuteNonQuery();
}
不需要特殊的 SQL 格式。 如果您没有使用参数化查询,您就做错了! 这不仅仅适用于 DateTime 值。在 SQL 语句中使用的 所有 数据都应该这样处理。这具有超出简单日期值的安全和性能影响。 Go parameters, or go home(我的意思是:回家。不要写不好的代码。我们不再需要了。)
由于它适用于问题,这意味着问题完全关于将字符串解析为 C# DateTime 值。将此数据移动到 SQL 的下一步只是不相关。值得庆幸的是,.Net 在这里为您提供了一些选择。具体来说,看一下 Parse 函数族,包括:
DateTime.Parse()
DateTime.TryParse()
DateTime.ParseExact()
DateTime.TryParseExact()
后两者允许您指定组 允许的格式,这些格式可以匹配系统实际看到的格式。 NuGet 可以成为该领域的进一步资源。
你说那是什么?您想允许用户输入 任何内容 吗?那是行不通的。时期。真正的人类可以 并且将 想出比你可能处理过的更多的方法来输入日期。更不用说当英国公民将值 1/2/2018 输入您的系统时您需要知道该怎么做,因为该人几乎肯定认为这意味着 2018 年 2 月 1 日,而 不是 1 月 2 日。像这样的文化差异意味着如果前端没有某种上下文输入过滤器,就不可能接受日期输入。您 必须 查看您的用户界面以帮助您的用户创建您的代码将理解的值...但是我们在问题中没有足够的信息来提供该领域的任何指导。
为了在我的程序中使用它,我修复了它。 现在我可以检测并理解这样的输入: “2008 年 9 月 11 日” 《2017》 "today" "yesterday" “2002 年 9 月 11 日” "march 2017" “2010 年 1 月 1 日” “01-01-2010” “2019 年 5 月 1 日” “31.October 2020” “4 月 1 日” "december"
如果有人也有兴趣编写类似的功能,请发表评论,因为代码将近 300 行。