将UTC字符串转换为golang时间对象

时间:2016-08-05 21:33:12

标签: datetime go time

我有这个日期时间,或类似的东西。

2014-11-17 23:02:03 +0000 UTC

我想将此转换为时间对象,除了time.Parse之外,我还无法生成0001-01-01 00:00:00 +0000 UTC 的任何输出:

time.RFC3339
0001-01-01 00:00:00 0000 UTC
2016-10-10
time.UnixDate

我已尝试过这些布局:

parse

还有一些 - 没有人工作过。

这就是我调用updatedAt, err := time.Parse(time.UnixDate, updatedAtVar) 的方式:

class HashingTable
{
   ...
   public:
   /*
   *    Constructors
   */

   // Default constructor
   HashingTable();

   // Default destructor
   virtual ~HashingTable();

   // Constructor requiring size of vector to create
   HashingTable(int size);

   // Copy constructor requiring another instance of HashingTable
   explicit HashingTable(const HashingTable& ht);
}

// Copy constructor using another table instance
template <class obj_type>
HashingTable<obj_type>::HashingTable(const HashingTable& ht)
{   
    cout << "Copy constructor called" << endl;
    *this = ht;
}

// Overload of operator=
template <class obj_type>
HashingTable<obj_type>& HashingTable<obj_type>::operator=(constHashingTable& ht)
{
    cout << "In operator=..."
    if (this != &ht) // no need to copy itself
    {
        // do some stuff to *this
    }
    return *this;
}

如何从字符串创建时间对象?

3 个答案:

答案 0 :(得分:8)

您很可能使用了错误的布局,并且没有检查返回的错误。

布局必须是此日期/时间,格式为输入时间:

Mon Jan 2 15:04:05 -0700 MST 2006

请参阅此工作代码:

layout := "2006-01-02 15:04:05 -0700 MST"
t, err := time.Parse(layout, "2014-11-17 23:02:03 +0000 UTC")
fmt.Println(t, err)

输出(在Go Playground上尝试):

2014-11-17 23:02:03 +0000 UTC <nil>

修改

在您的问题中,您在输入时间中添加了+符号(作为区域偏移的一部分),但是您有其他格式的错误。

Time.String()使用以下格式字符串:

"2006-01-02 15:04:05.999999999 -0700 MST"

因此要么使用它来解析时间,要么使用Time.Format()来生成字符串表示,您可以在其中指定布局,因此您可以使用相同的布局来解析时间字符串。

第二轮:

您在URL中包含时间字符串。 +符号是URL编码中的特殊字符:它表示空格。所以+被转换为空格(因此它会从你的时间字符串中消失)。使用正确的URL编码!查看net/url包和this example

答案 1 :(得分:1)

还没有看到这个,但是对于那些不知道格式的人,时间已经将其内置为常量。因此您可以在解析或格式化时引用它们。

time.Parse(time.RFC3339, <your time.Time object here>)
<time.Time object>.Format(time.RFC3339) //or other type of formats

在这里仅供参考

ANSIC       = "Mon Jan _2 15:04:05 2006"
UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
RFC822      = "02 Jan 06 15:04 MST"
RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339     = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen     = "3:04PM"

答案 2 :(得分:0)

您可能使用了错误的布局。正如time.Parse中所述,您需要指定一个布局,以帮助Go了解输入日期的格式化方式。

有预定义的布局(就像你使用的布局一样),但没有一个匹配你的输入。因此,您需要定义自定义布局。

布局使用以下日期作为参考:

Mon Jan 2 15:04:05 MST 2006

布局与该日期的表示形式无关,与输入的表示形式相匹配:

t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", "2014-11-17 23:02:03 +0000 UTC")

另请记得检查err是否有错误。您的尝试可能会返回错误,但您没有检查它。

package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
    t, err := time.Parse("2006-01-02 15:04:05 -0700 UTC", "2014-11-17 23:02:03 +0000 UTC")
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(t)
}