gpt4 book ai didi

java - Joda ISOChronology getInstance() 在处理过程中发生变化

转载 作者:行者123 更新时间:2023-12-05 06:44:22 26 4
gpt4 key购买 nike

Joda 2.2 LocalDateTime 在处理过程中返回基于不同时区的日期时间。我相信 2.3 中有一些更改来解决围绕 ISOChronology DateTimeZone 缓存的一些竞争条件,但在这种情况下,我认为这不是问题的原因。

直到执行的某个点 LocalDateTime 是基于欧洲/伦敦的默认 jvm 时区,正如我所期望的那样。但过了一段时间,它切换到基于 UTC。结果如下:

20150409-09:10:45.281 DEBUG [Thread-1] LocalDateTime=2015-04-09T09:10:45.281 ISOChronology.getInstance(): ISOChronology[欧洲/伦敦] DateTimeZone.getDefault( ): 欧洲/伦敦指数:20 UTC 指数:12

然后(从那时起一直)

20150409-09:10:46.125 DEBUG [Thread-0] LocalDateTime=2015-04-09T08:10:46.125 ISOChronology.getInstance(): ISOChronology[UTC] DateTimeZone.getDefault():欧洲/伦敦指数:20 UTC 指数:12

LocalDateTime 调用 ISOChronology.getInstance() 来识别本地 DateTimeZone。 ISOChronology 然后调用 DateTimeZone.getDefault() 以返回默认的本地时区。我无法理解的是 DateTimeZone.getDefault() 没有改变,但 ISOChronology.getInstance() 正在从欧洲/伦敦切换到 UTC。我还打印出 ISOChronology 用来在其快速缓存中查找它们的内部索引。他们似乎没有改变。有谁能解释为什么会发生这种情况?

编辑:

这是日志代码:

logger.debug("LocalDateTime=" + new LocalDateTime() + " ISOChronology.getInstance(): " + ISOChronology.getInstance() 
+ " DateTimeZone.getDefault(): " + DateTimeZone.getDefault()
+ " index: " + (System.identityHashCode(DateTimeZone.getDefault()) & (64 - 1))
+ " UTC index: " + (System.identityHashCode(DateTimeZone.UTC) & (64 - 1)));

它正在创建一个空的构造函数 LocalDateTime,并检查 ISOChronology.getInstance() 和 DateTimeZone.getDefault() 在那个时间点返回的值,以及 ISOChronology 将在内部使用的索引来查找它们。

最佳答案

答案似乎是 Protostuff(一个提供通过 Protobuff 自动序列化对象的功能的库)在这种情况下覆盖 ISOChronology,因为它构造了一个 DateTime,它正在反序列化为从我们的服务器接收到的有效负载的一部分。 ISOChronology 更改之前的堆栈是:

ISOChronology.getInstance() line: 79    
DateTime(BaseDateTime).<init>() line: 61
DateTime.<init>() line: 171
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]
NativeConstructorAccessorImpl.newInstance(Object[]) line: not available
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: not available
Constructor<T>.newInstance(Object...) line: not available
RuntimeEnv$DefaultInstantiator<T>.newInstance() line: 300
RuntimeSchema<T>.newMessage() line: 345
ByteArrayInput.mergeObject(T, Schema<T>) line: 374
RuntimeUnsafeFieldFactory$13$1.mergeFrom(Input, T) line: 773
RuntimeSchema<T>(MappedSchema<T>).mergeFrom(Input, T) line: 188
IOUtil.mergeFrom(byte[], int, int, T, Schema<T>, boolean) line: 43
ProtobufIOUtil.mergeFrom(byte[], T, Schema<T>) line: 95

在这些反射调用前后,ISOChronology 中的 cCache 的值是 -

之前:

cCache: {Europe/London=ISOChronology[Europe/London], UTC=ISOChronology[UTC]} 

之后:

cCache: {Europe/London=ISOChronology[UTC], UTC=ISOChronology[UTC]}

编辑:对于遇到 DateTime 等类似问题的任何人变得不稳定,这是一个关于它的 protostuff 线程:https://groups.google.com/forum/#!topic/protostuff/GmFldwwexUk

关于java - Joda ISOChronology getInstance() 在处理过程中发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533632/

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