【问题标题】:What is the C# DateTimeOffset equivalent in GoGo 中的 C# DateTimeOffset 等价物是什么
【发布时间】:2015-10-15 09:37:15
【问题描述】:

我有以下代码,它将字符串作为输入,转换为 UNIX 时间戳。我想在 golang 中做同样的事情,但我无法识别将在 Go 中提供相当于 DateTimeOffset 结构的结构或函数。

class Program
{
    static void Main(string[] args)
    {
        var date = GetUtcTimestampFromAttribute();
        Console.WriteLine(date);
        if (date != null)
        {
            Console.WriteLine(ToUnixTimeStamp(date.Value));
        }

        Console.ReadKey();
    }

    public static DateTimeOffset? GetUtcTimestampFromAttribute()
    {
        var ticks = long.Parse("7036640000000");
        Console.WriteLine(ticks);
        return GetUtcTimestampFromTicks(ticks);
    }

    public static DateTimeOffset? GetUtcTimestampFromTicks(long ticks)
    {
        Console.WriteLine(new DateTimeOffset(ticks, TimeSpan.Zero));
        return ticks != 0 ?
            new DateTimeOffset(ticks, TimeSpan.Zero) :
            (DateTimeOffset?)null;
    }

    public static long ToUnixTimeStamp(DateTimeOffset timeStamp)
    {
        var epoch = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
        return Convert.ToInt64((timeStamp - epoch).TotalSeconds);
    }
}

例如:

输入:635804753769100000

输出:1444878577

UTC 对应时间:10/15/2015 3:09:36 AM +00:00

有人可以帮助我解决上述问题。

谢谢

【问题讨论】:

  • 转换是否双向有效?

标签: c# datetime go


【解决方案1】:

我相信time 包可以满足您的一切需求,它是 IMO 使用过的任何语言中最好的时间库。示例:

package main 

import(
    "fmt"
    "time"
)

func main(){

    // this is how you parse a unix timestamp    
    t := time.Unix(1444902545, 0)

    // get the UTC time
    fmt.Println("The time converted to UTC:", t.UTC())

    // convert it to any zone: FixedZone can take a utc offset and zone name
    fmt.Println(t.In(time.FixedZone("IST", 7200)))

}

编辑将时间对象转换回 unix 时间戳很简单:

t.Unix()

t.UnixNano()

【讨论】:

  • 我不想要时区输出。我需要一个 Unix 时间戳。我正在使用 c#,但我无法将其作为 go 代码放入。
  • @Prashant 阅读了 lib 文档,我只是给出了一个简化的例子。基本上,time.Time 对象可以转换为秒或纳秒分辨率的 unix 时间戳。
  • 是的@not_a_Golfer,但我的问题是我无法将该输入数字转换为有效的时间对象。
  • @Prashant 为什么不呢?我已经在我的示例中展示了如何做到这一点。如果是纳/微分辨率,您只需将数字分成纳秒部分和秒部分。
  • 你能帮我把这个长数字分成几部分吗?我无法理解如何拆分它。
【解决方案2】:

例如,

package main

import (
    "fmt"
    "time"
)

func TimeFromTicks(ticks int64) time.Time {
    base := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix()
    return time.Unix(ticks/10000000+base, ticks%10000000).UTC()
}

func main() {
    fmt.Println(TimeFromTicks(635804753769100000))
}

输出:

2015-10-15 03:09:36.0091 +0000 UTC

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-05-08
    • 2023-03-30
    • 2010-09-17
    相关资源
    最近更新 更多