- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 Golang 中,我如何解析一个月中有序数 日的日期?例如以下日期:
"Sunday 23rd January 2033 04:38:25 AM"
对于这个特定的日期,我可以对 rd 进行硬编码并在 time.Parse()
中使用此布局:
"Monday 02rd January 2006 15:04:05 PM"
但是如果这个月的一天是 21 号呢?
"Sunday 21st January 2033 04:38:25 AM"
(忽略这个日期不正确的事实)
以下内容适用于这种情况,但显然是错误的:
"Monday 02st January 2006 15:04:05 PM"
我一直在阅读 source code尚未证悟。
(我知道缺少时区也需要由程序逻辑来解决)。
这出现在我自己写的一组问题中,以改进我的日期解析。参见 https://github.com/soniah/date_practice如果你也需要练习!
最佳答案
如果你有一把锤子,一切看起来都像钉子。如果你有一个计算机程序员,一切看起来都像一个函数。
首先是序数函数的映射,
package main
import (
"fmt"
"strconv"
)
// generateOrdinalsMap generates map[ordinal]cardinal to stdout
// for the non-negative interval [min, max]
// as var name = map[string]string{}.
func generateOrdinalsMap(name string, min, max int) {
fmt.Printf("\nvar " + name + " = map[string]string{ // map[ordinal]cardinal\n")
for i := min; i >= 0 && i <= max; i++ {
var o string
switch i % 10 {
case 1:
o = "st"
case 2:
o = "nd"
case 3:
o = "rd"
default:
o = "th"
}
if 11 <= i && i <= 13 {
o = "th"
}
c := strconv.Itoa(i)
o = c + o
fmt.Printf(`"%s": "%s", `, o, c)
if (i)%5 == 0 || i == max {
fmt.Printf("\n")
}
}
fmt.Printf("}\n\n")
}
func main() {
// Generate ordinal map for days.
generateOrdinalsMap("dayOrdinals", 1, 31)
}
Playground :https://play.golang.org/p/W7Ad0pjjGu
输出:
var dayOrdinals = map[string]string{ // map[ordinal]cardinal
"1st": "1", "2nd": "2", "3rd": "3", "4th": "4", "5th": "5",
"6th": "6", "7th": "7", "8th": "8", "9th": "9", "10th": "10",
"11th": "11", "12th": "12", "13th": "13", "14th": "14", "15th": "15",
"16th": "16", "17th": "17", "18th": "18", "19th": "19", "20th": "20",
"21st": "21", "22nd": "22", "23rd": "23", "24th": "24", "25th": "25",
"26th": "26", "27th": "27", "28th": "28", "29th": "29", "30th": "30",
"31st": "31",
}
其次,一个 time.Parse
包装函数,它将 value
中的序数日转换为基数日,然后再使用基数日 layout
,
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
var dayOrdinals = map[string]string{ // map[ordinal]cardinal
"1st": "1", "2nd": "2", "3rd": "3", "4th": "4", "5th": "5",
"6th": "6", "7th": "7", "8th": "8", "9th": "9", "10th": "10",
"11th": "11", "12th": "12", "13th": "13", "14th": "14", "15th": "15",
"16th": "16", "17th": "17", "18th": "18", "19th": "19", "20th": "20",
"21st": "21", "22nd": "22", "23rd": "23", "24th": "24", "25th": "25",
"26th": "26", "27th": "27", "28th": "28", "29th": "29", "30th": "30",
"31st": "31",
}
// parseOrdinalDate parses a string time value using an ordinary package time layout.
// Before parsing, an ordinal day, [1st, 31st], is converted to a cardinal day, [1, 31].
// For example, "1st August 2017" is converted to "1 August 2017" before parsing, and
// "August 1st, 2017" is converted to "August 1, 2017" before parsing.
func parseOrdinalDate(layout, value string) (time.Time, error) {
const ( // day number
cardMinLen = len("1")
cardMaxLen = len("31")
ordSfxLen = len("th")
ordMinLen = cardMinLen + ordSfxLen
)
for k := 0; k < len(value)-ordMinLen; {
// i number start
for ; k < len(value) && (value[k] > '9' || value[k] < '0'); k++ {
}
i := k
// j cardinal end
for ; k < len(value) && (value[k] <= '9' && value[k] >= '0'); k++ {
}
j := k
if j-i > cardMaxLen || j-i < cardMinLen {
continue
}
// k ordinal end
// ASCII Latin (uppercase | 0x20) = lowercase
for ; k < len(value) && (value[k]|0x20 >= 'a' && value[k]|0x20 <= 'z'); k++ {
}
if k-j != ordSfxLen {
continue
}
// day ordinal to cardinal
for ; i < j-1 && (value[i] == '0'); i++ {
}
o := strings.ToLower(value[i:k])
c, ok := dayOrdinals[o]
if ok {
value = value[:i] + c + value[k:]
break
}
}
return time.ParseInLocation(layout, value, defaultLocation)
}
// Times without a timezone are Hong Kong times.
var defaultLocation = func(name string) *time.Location {
loc, err := time.LoadLocation(name)
if err != nil {
loc = time.UTC
}
return loc
}(`Asia/Hong_Kong`)
func main() {
var dates = []struct {
layout, value string
}{
{"Monday 02 January 2006 15:04:05 PM", "Friday 24th November 2017 13:14:07 PM"},
{"2 January 2006", "1st August 2017"}, // ISO
{"January 2, 2006", "August 1st, 2017"}, // USA
}
fmt.Println()
for _, d := range dates {
fmt.Printf("Layout: %q\n", d.layout)
fmt.Printf("Value: %q\n", d.value)
t, err := parseOrdinalDate(d.layout, d.value)
fmt.Printf("Time: %v Error: %v\n", t, err)
fmt.Printf("Unix: %v Error: %v\n", t, err)
fmt.Println()
}
}
Playground :https://play.golang.org/p/5INR83e66T
输出:
Layout: "Monday 02 January 2006 15:04:05 PM"
Value: "Friday 24th November 2017 13:14:07 PM"
Time: 2017-11-24 13:14:07 +0800 HKT Error: <nil>
Unix: 2017-11-24 13:14:07 +0800 HKT Error: <nil>
Layout: "2 January 2006"
Value: "1st August 2017"
Time: 2017-08-01 00:00:00 +0800 HKT Error: <nil>
Unix: 2017-08-01 00:00:00 +0800 HKT Error: <nil>
Layout: "January 2, 2006"
Value: "August 1st, 2017"
Time: 2017-08-01 00:00:00 +0800 HKT Error: <nil>
Unix: 2017-08-01 00:00:00 +0800 HKT Error: <nil>
第三,完成并运行您的date_practice
测试,
{
"wombat",
"Sunday 23rd January 2033 04:38:25 AM",
"Monday 2 January 2006 03:04:05 PM",
1990039105,
parseOrdinalDate,
nil,
},
{
"kangaroo",
"Tuesday 7th November 2017 03:18:25 PM",
"Monday 2 January 2006 03:04:05 PM",
1510039105,
parseOrdinalDate,
nil,
},
关于date - 使用序号日期字段解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47471071/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!