【问题标题】:Golang: How to validate a MySQL timestamp stringGolang:如何验证 MySQL 时间戳字符串
【发布时间】:2016-07-17 05:37:30
【问题描述】:

我们如何检查一个被认为是 MySQL TIMESTAMP 的字符串实际上是有效的?使用的格式是:

YYYY-MM-DD HH:MM:SS[.fraction] 其中“分数”有 3 位数字。

例如2016-03-28 12:17:30.022 应该是有效的。我最好避免使用正则表达式并使用time.Parse(),但欢迎提出任何其他建议。

【问题讨论】:

  • 调用 time.Parse 并在您的时间字符串上使用布局字符串,例如“2006-01-02 15:04:05.999”。如果这导致有效的 time.Time 值并且没有错误,那么您的字符串应该在数据库中工作。我不使用 MySQL,但在 PostgreSQL 和 Go 之间,您可以传递时间戳和 time.Time 值而不转换为字符串......所以也许这可以简化您的问题。使用 time.Parse 对 Go 中的字符串进行转换,然后将 time.Time 值写入数据库。
  • 谢谢@Snowman。这正是我一直在寻找的......
  • 很高兴为您提供帮助。我发布了该评论作为答案。

标签: mysql validation date go time


【解决方案1】:

调用 time.Parse 并使用诸如“2006-01-02 15:04:05.999”之类的布局字符串 在你的时间字符串上。如果这导致有效的 time.Time 值并且没有错误,那么您的字符串应该在数据库中工作。

timeStamp, err := time.Parse("2006-01-02 15:04:05.999", yourTimeString)
    if err != nil {
        // do something with err...
    }
// do something with timeStamp...

我不使用 MySQL,但在 PostgreSQL 和 Go 之间,您可以传递时间戳和 time.Time 值而无需转换为字符串......所以也许这可以简化您的问题。使用 time.Parse 对 Go 中的字符串进行转换,然后将 time.Time 值写入 db。

【讨论】:

    【解决方案2】:

    您可以使用TIMESTAMP() 将字符串转换为timestamp。如果它可以转换为有效的时间戳,则它是有效的。如果转换为NULL,则不是空时间戳字符串。

    用途:

    TIMESTAMP('2016-03-28 12:17:30.022') IS NOT NULL
    

    演示

    mysql> select TIMESTAMP('2016-03-28 12:17:30.022'), TIMESTAMP('2016-03-28 12:17:300.022');
    +--------------------------------------+---------------------------------------+
    | TIMESTAMP('2016-03-28 12:17:30.022') | TIMESTAMP('2016-03-28 12:17:300.022') |
    +--------------------------------------+---------------------------------------+
    | 2016-03-28 12:17:30.022              | NULL                                  |
    +--------------------------------------+---------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> select TIMESTAMP('2016-03-28 12:17:30.022') IS NOT NULL, TIMESTAMP('2016-03-28 12:17:300.022') IS NOT NULL;
    +--------------------------------------------------+---------------------------------------------------+
    | TIMESTAMP('2016-03-28 12:17:30.022') IS NOT NULL | TIMESTAMP('2016-03-28 12:17:300.022') IS NOT NULL |
    +--------------------------------------------------+---------------------------------------------------+
    |                                                1 |                                                 0 |
    +--------------------------------------------------+---------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    

    【讨论】:

    • 感谢您的快速响应,但我想在 Go 代码中进行检查。
    【解决方案3】:

    正如@Snowman 在他的评论中指出的那样,一种解决方案是使用布局字符串和time.Parse()

    package main
    
    import (
      "fmt"
      "time"
    )
    
    func main() {
    
      timestamp    := "2016-03-28 11:50:50.476"
      const layout  = "2006-01-02 03:04:05.999"
    
      _, error := time.Parse(layout, timestamp)
    
      if error != nil {
        fmt.Println(error)
      } else {
        fmt.Println("valid!")
      }
    }
    

    演示: https://play.golang.org/p/6bcciN_OAb
    另请查看:Date parsing in Go

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 2011-08-19
      • 2012-12-20
      • 2019-04-16
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多