gpt4 book ai didi

Java 与 C# 毫秒时间戳生成

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:07 40 4
gpt4 key购买 nike

我有以下 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给出“欧洲/伦敦 (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() 方法中缺少 DateTimeKindToUniversalTime() 的使用。

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

最佳答案

我认为,它不起作用,因为您没有在 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 Time 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);

关于Java 与 C# 毫秒时间戳生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33461756/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com