Java与C#毫秒时间戳生成

时间:2015-11-01 11:41:00

标签: java c# datetime unix-timestamp epoch

我有以下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=Europe%2FLondon我们可以看到这给出了“2015年10月1日星期四00:00:00(am)在欧洲/伦敦(BST)时区” 。

现在,我的问题(或缺乏理解!)是我在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=Europe%2FLondon给出“2015年10月1日星期四01:00:00(am)在欧洲/伦敦(BST)时区”。

  1. 为什么这会给+01:00?
  2. 我如何获得C#代码来生成完全 Java的功能?
  3. 非常重要的是,我可以从两种语言一致地查询数据库中的时间戳,但目前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);
    

    请注意,新DateTimeKind方法中缺少ToUniversalTime()ToMillisecondsSinceUnixEpoch()

    但是,在使用DateTime之前,我并不真正感谢ToUniversalTime()正在做什么。在创建初始DateTimeKind.UTC时使用DateTime应该这样做了吗?任何有关DateTime在此(对我来说奇怪的情况)发生的事情的澄清将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

在Java示例中,您将使用makeSimpleDateFormat的方法在方法sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"))中应用转换。因此,您输入日期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);