Java 将UTC时间戳转换为本地日期
因此,我现在尝试了大约几个小时将时间戳转换为本地日期(CEST) 无论我在互联网上尝试和查找什么,它都不起作用。我总是能回到UTC时间Java 将UTC时间戳转换为本地日期,java,datetime,utc,Java,Datetime,Utc,因此,我现在尝试了大约几个小时将时间戳转换为本地日期(CEST) 无论我在互联网上尝试和查找什么,它都不起作用。我总是能回到UTC时间 为了更好地理解:stamp是一个带有long类型的可变时间戳,我将从服务中接收它您的时区id可能不正确(Java无法识别)。在这种情况下,时区的计算结果似乎不是抛出异常,而是UTC 请尝试以下方法: simpleDateFormat.setTimeZone(TimeZone.getTimeZone("ECT")); 是一个页面,提供有关Java的时区的一些信息
为了更好地理解:stamp是一个带有long类型的可变时间戳,我将从服务中接收它您的
时区
id可能不正确(Java无法识别)。在这种情况下,时区
的计算结果似乎不是抛出异常,而是UTC
请尝试以下方法:
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("ECT"));
是一个页面,提供有关Java的
时区的一些信息和时区id列表。您的时区id可能不正确(Java无法识别)。在这种情况下,时区
的计算结果似乎不是抛出异常,而是UTC
请尝试以下方法:
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("ECT"));
是一个页面,提供有关Java的时区的一些信息和时区ID列表。tl;博士
细节
几个问题:
- 您没有使用。
- 专有名称采用
大陆/地区
格式
- 在诸如
CEST
等媒体中常见的3-4个字母的缩写不是真正的时区避免它们。它们既不是标准化的,也不是唯一的(!)
- 您使用的是过时的日期时间类,这些类设计糟糕且容易混淆。它们已被框架所取代
如果您所说的CEST
是指夏季比UTC提前2小时,那么让我们以时区为例。你的问题缺少示例数据,所以我将补足这个示例
显然,您的输入是从UTC 1970年第一个时刻开始的整秒计数。该值可以直接使用,无需乘法
ZoneId
类表示时区。即时
是UTC时间线上的一个点,分辨率高达纳秒。ZonedDateTime
是调整到ZoneId
中的Instant
ZoneId zoneId = ZoneId.of ( "Europe/Paris" );
long input = 1_468_015_200L; // Whole seconds since start of 1970.
Instant instant = Instant.ofEpochSecond ( input );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
转储到控制台
System.out.println ( "input: " + input + " | instant: " + instant + " | zdt: " + zdt );
输入:1468015200 |即时:2016-07-08T22:00:00Z | zdt:2016-07-09T00:00+02:00[欧洲/巴黎]
tl;博士
细节
几个问题:
- 您没有使用。
- 专有名称采用
大陆/地区
格式
- 在诸如
CEST
等媒体中常见的3-4个字母的缩写不是真正的时区避免它们。它们既不是标准化的,也不是唯一的(!)
- 您使用的是过时的日期时间类,这些类设计糟糕且容易混淆。它们已被框架所取代
如果您所说的CEST
是指夏季比UTC提前2小时,那么让我们以时区为例。你的问题缺少示例数据,所以我将补足这个示例
显然,您的输入是从UTC 1970年第一个时刻开始的整秒计数。该值可以直接使用,无需乘法
ZoneId
类表示时区。即时
是UTC时间线上的一个点,分辨率高达纳秒。ZonedDateTime
是调整到ZoneId
中的Instant
ZoneId zoneId = ZoneId.of ( "Europe/Paris" );
long input = 1_468_015_200L; // Whole seconds since start of 1970.
Instant instant = Instant.ofEpochSecond ( input );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
转储到控制台
System.out.println ( "input: " + input + " | instant: " + instant + " | zdt: " + zdt );
输入:1468015200 |即时:2016-07-08T22:00:00Z | zdt:2016-07-09T00:00+02:00[欧洲/巴黎]
这应该会有帮助:正如您可能看到的,我以11票赞成的票数尝试了这个建议,它不起作用。我没有使用Java8,正在使用Java6EE@Nali您应该发布示例数据和结果,以便我们进行验证。这应该会有所帮助:正如您可能看到的,我尝试了11次投票的建议,它不起作用尝试我没有使用Java 8,在Java6上工作EE@Nali您应该发布示例数据和结果,以便我们进行验证。我尝试了所有方法,它只会显示UTC时间,什么都没有else@Nali你所说的一切到底是什么意思?您是否尝试过大陆/地区
格式<代码>SimpleDataFormat.setTimeZone(TimeZone.getTimeZone(“欧洲/布鲁塞尔”)代码>用于example@NaliTimeZone.getAvailableIDs()
返回什么?不管怎样,你应该使用这些值中的一个。不管它现在起作用了,我不知道为什么但它起作用了:D谢谢我尝试了一切它只会告诉我UTC时间什么都没有else@Nali你所说的一切到底是什么意思?您是否尝试过大陆/地区
格式<代码>SimpleDataFormat.setTimeZone(TimeZone.getTimeZone(“欧洲/布鲁塞尔”)代码>用于example@NaliTimeZone.getAvailableIDs()
返回什么?不管怎样,你应该使用这些值中的一个。不管它现在起作用,我不知道为什么它起作用:Dthanks@Nali您是指表示日期时间值的字符串格式吗?你的问题没有提到格式。无论如何,在堆栈溢出中搜索许多使用DateTimeFormatter
生成任何格式字符串的示例。此处显示的格式符合ISO 8601标准。您可以指定其他格式,或者让java.time自动本地化为任何语言环境
@BasilBourque,如OP尚未使用java 8的注释中所述。我不知道他的限制是什么,但我想他目前必须解决这个问题。@C.champan大多数java.time功能在项目中被移植到java 6和7,并在ThreeTenABP项目中进一步适应Android。这些名称来自定义java.time的JSR310。@BasilBourque很棒!我不知道。谢谢@Nali您是指表示日期时间值的字符串格式吗?你的问题没有提到格式。无论如何,在堆栈溢出中搜索许多使用DateTimeFormatter
生成任何格式字符串的示例。此处显示的格式符合ISO 8601标准。您可以指定其他格式,或者让java.time自动本地化为任何语言环境
@BasilBourque,如OP尚未使用java 8的注释中所述。我不