Golang非常规时间格式转换求助:VBA时间转ISO格式失败
解决Go语言中日期格式转换问题
看起来你卡在了Go的日期解析和格式化步骤上,我来帮你梳理下问题所在并给出解决方案:
首先,你遇到的核心问题应该是时间解析的布局字符串不匹配。Go语言的time.Parse函数要求布局字符串必须使用Go的参考时间Mon Jan 2 15:04:05 MST 2006作为模板,来对应你输入时间的各个部分。
针对你的输入时间4/20/2018 9:08:34 AM,正确的解析布局应该是"1/2/2006 3:04:05 PM"(注意月份是1对应你的4,日期是2对应你的20,12小时制的小时用3,加上AM/PM标识)。然后目标格式2009-04-20T21:18:44Z其实是标准的RFC3339格式,Go里可以直接用time.RFC3339常量来格式化,或者写对应的布局字符串"2006-01-02T15:04:05Z"。
下面是可以正常运行的代码示例:
package main import ( "fmt" "time" ) func main() { inputTime := "4/20/2018 9:08:34 AM" // 定义匹配输入格式的布局字符串 layout := "1/2/2006 3:04:05 PM" // 解析时间,注意这里默认是本地时区,如果需要转UTC要额外处理 t, err := time.Parse(layout, inputTime) if err != nil { fmt.Println("解析错误:", err) return } // 格式化为目标的RFC3339格式(UTC时区) targetTime := t.UTC().Format(time.RFC3339) fmt.Println("转换结果:", targetTime) }
关键注意点:
- 布局字符串的每一部分必须严格和输入时间的格式对应:比如你的输入是
月/日/年,所以布局要用1/2/2006(1代表参考时间的1月,2代表2日,2006代表年);12小时制的小时用3,加上PM/AM来匹配输入的上午标识。 - 目标格式中的
Z代表UTC时区,所以解析后需要调用UTC()方法将时间转换为UTC时区,再进行格式化,否则会使用本地时区的偏移量。 - 关于你提到的VBA的
dddd.ttttt格式:这其实是VBA中将日期存储为浮点数的方式(整数部分是日期,小数部分是时间),不过你已经通过CDate转成了字符串格式,所以只需要处理字符串的转换即可。
内容的提问来源于stack exchange,提问作者Gofurther
相关产品推荐
相关产品推荐

