Java与C#毫秒时间戳生成

本文关键字:时间戳 Java | 更新日期: 2023-09-27 18:20:01

我有下面的Java代码,它创建了一个毫秒时间戳,并将其放置在Mongo数据库中

private static long ukTimeStringToUtcMillis(String s) {
    SimpleDateFormat sdf = makeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    try {
        return sdf.parse(s).getTime();
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}
private static SimpleDateFormat makeSimpleDateFormat(String s) {
    SimpleDateFormat sdf = new SimpleDateFormat(s);
    sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
    return sdf;
}

我只使用创建"2015/10/01 00:00:00"的时间戳

long l = ukTimeStringToUtcMillis("2015-10-01T00:00:00.000");

这给了我1443654000000[Java]的时间戳,使用http://www.epochconverter.com/epoch/timezones.php?epoch=1443654000000&tz=欧洲%2FLondon我们可以看到,这给出了"欧洲/伦敦(BST)时区2015年10月1日星期四00:00:00(am)"。

现在,我的问题(或缺乏理解!)是我在C#中有等效的代码来转换为Unix Epoch毫秒

public static class DateTimeHelpers
{
    public static DateTime UnixEpoch()
    {
        return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    }
    public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
    {
        return UnixEpoch().AddMilliseconds(milliseconds).ToUniversalTime();
    }
    public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime)
    {
        return (long)(dateTime - UnixEpoch()).TotalMilliseconds;
    }
}

获取"2015/10/01 00:00:00"的毫秒数我做

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0, DateTimeKind.Utc);
long l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt);

但这给出了l = 1443657600000[C#]http://www.epochconverter.com/epoch/timezones.php?epoch=1443657600000&tz=欧洲%2FLondon给出"欧洲/伦敦(BST)时区2015年10月1日星期四01:00:00(am)"。

  1. 为什么是01:00
  2. 我如何才能让C#代码生成Java所做的

非常重要的是,我可以从两种语言中一致地查询数据库中的时间戳,但目前C#给了我一个小时的差异。

谢谢你抽出时间。


答案:为了让它发挥作用,我改变了的方法

public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime)
{
    return (long)(dateTime.ToUniversalTime().Subtract(UnixEpoch())).TotalMilliseconds;
}

并使用

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0);
lonf l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt);

注意新的ToMillisecondsSinceUnixEpoch()方法中缺少DateTimeKind和使用ToUniversalTime()

然而,在我使用ToUniversalTime()之前,我并不是很欣赏DateTime所做的一切。在创建初始DateTime时使用DateTimeKind.UTC应该做到这一点吗?如果能澄清DateTime在这个(对我来说很奇怪的情况)中发生了什么,我们将不胜感激。

Java与C#毫秒时间戳生成

我认为,它不起作用,因为您在Java和C#中没有使用相同的时区。

在Java示例中,使用sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"))在方法makeSimpleDateFormat中应用转换。因此,您输入的日期2015/10/01 00:00:00被转换为30 Sep 2015 23:00:00 GMT(或Epoch Unix时间1443654000000)。

但在C#代码中,您只是使用UTC日期。这就解释了1小时的差异。您必须应用等效的转换来检索相同的Epoch Unix时间。以下片段将修复您的代码:

public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime)
{
    DateTimeOffset offset = new DateTimeOffset(dateTime, new TimeSpan(1,0,0));
    return (long)(offset - UnixEpoch()).TotalMilliseconds;
}

并将其用于:

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0, DateTimeKind.Unspecified);
long l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt);