- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Linux 上运行的嵌入式 Java 应用程序应该允许用户通过 GUI 更改时区。我的应用程序在 OSGI 容器中运行(请参阅下文为什么我认为这是相关的)并且在使用新时区之前不需要重新启动。
从我的 Java/OSGi 应用程序持久设置时区的推荐方法是什么?
我可以想到以下方法,我列出了一些优点和缺点。我错过了什么吗?推荐什么?:
TimeZone.setDefault(...)
并更新所有保存 Clock
的实例旧 TZ(因此需要某种事件)。缺点:这种方法依赖于操作系统并且级别很低,我也想保持操作系统时钟 UTC。优点:操作系统负责存储 TZ,TZ 在下次启动应用程序时立即正确。-Duser.timezone=...
参数。缺点:非常丑陋,甚至更低级别,但允许将操作系统时钟保留为 UTC,同时让应用程序以正确的 TZ 启动。还需要在发生变化时更新 Clock
实例。TimeZone.setDefault(...)
并在启动时调用它early。这将需要一个单独的持久性(首选项)来保存它。同样,在当前运行的 JVM 中,所有引用旧 TZ 的 Clock
实例都需要在更改时更新(需要事件)。在 OSGi 容器中运行时,无法保证 bundle 的启动顺序,因此我无法确定默认 TZ 在使用前是否已设置。我怎么能保证这一点?此外,JSR310 明确建议不要在 Clock 中使用“默认 TZ”。Instant
和 LocalXXX
值之间的每次转换时,显式传递时区。这摆脱了需要一个事件来更新 Clock
实例。但我们需要注意不要使用LocalDate.now(clock)
,因为它使用了时钟的TZ(之后不再正确)。如何在 OSGi 中拥有这个全局变量?使用 ConfigAdmin
?如何使我无法控制的代码正常运行(例如,记录时间戳)?编辑:为了摆脱更新 Clock
的需要,我可以使用一个始终检查默认时区的时钟,但从性能 POV 来看这似乎不是最佳选择:
public class DefaultZoneClock extends Clock {
private final Clock ref = Clock.systemUTC();
@Override
public ZoneId getZone() {
return ZoneId.systemDefault(); // probed on each request
}
@Override
public Clock withZone(ZoneId zone) {
return ref.withZone(zone);
}
@Override
public Instant instant() {
return ref.instant();
}
}
这是个好主意吗?
编辑 2:
关于我上面的性能问题:它们显然是不合理的。当您调用 LocalDate.now()
时,会在内部构建一个新的 SytemClock
,它通过在 map 中搜索来设置当前的 ZoneID
- 这是与上面使用我的 DefaultZoneClock
完全相同,区别在于使用我的代码我可以注入(inject)任何其他 Clock
进行测试。 (所有客户端代码都将使用 LocalDate.now(clock)
)
下面的答案建议不要更改 JVM TimeZone,而是在必要时根据用户定义的 TimeZone 进行转换,这意味着我必须注意不要使用从中调用 TimeZone 的 java.time 方法时钟
,例如。如果我需要 LocaTime
使用
// OK, TimeZone is set explicitely from user data
LocalTime t = clock.instant().atZone(myUserZoneID).toLocalTime();
// Not OK, uses the Clock's internal TimeZone which may not have been set or updated
LocalTime t2 = LocalTime.now(clock);
最佳答案
根据我的经验,日期/时间应该始终在内部使用 UTC 表示。仅在向用户显示时转换为本地时间。此时,您还需要根据用户的语言环境对其进行格式化。
那么问题就变成了,您如何知道用户的时区和语言环境?这取决于应用程序的性质。如果它是单用户桌面应用程序,那么您应该在操作系统中查找这些应用程序或使用与 Config Admin 服务一起存储的配置。如果它是一个多用户网络应用程序,那么您可能会在网络 session 中获得一些与用户相关的信息;或使用 Accept-Language 标题甚至地理位置。
更新
Poster 澄清了该应用程序是嵌入式设备上的单用户应用程序。在这种情况下,每次需要显示时间时,只查询当前系统时区不是更容易吗?这避免了讨厌的全局变量,并且还允许您的应用程序动态响应时区的变化,例如,如果用户将设备从一个地方带到另一个地方。
我认为您不应该从您的 Java 应用程序调用 TimeZone.setDefault
,因为您要从哪里获得这些信息?也许直接用户输入,但用户不会更喜欢在操作系统中设置它,以便所有应用程序都能获得它吗?
关于Java:从 OSGi 应用程序中设置时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904219/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!