好的 - 我觉得这个基本问题很愚蠢,但是嘿.
我试图在Java webapp中的不同时区获取当前时间.我尝试了以下明显的解决方案:在我的servlet中,
Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());
然后我将日历对象作为请求属性'localCalendar'传递给JSP:
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
Run Code Online (Sandbox Code Playgroud)
但我的输出似乎忽略了时区设置,即
It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe
我猜它与Locale设置有关,有没有办法在另一个时区为我的Locale设置格式化时间?
一个老堆栈溢出发帖建议得到Java中的UTC时间戳的方式如下:
Instant.now() // Capture the current moment in UTC.
Run Code Online (Sandbox Code Playgroud)
不幸的是,这对我不起作用。我有一个非常简单的程序(转载如下),它展示了不同的行为。
在 Windows 上:时间是本地时间,并标有 GMT 的偏移量
在 Linux 上:时间再次是本地时间,并且为本地时区正确标记了时间
问题:我们如何在 Java 程序中显示 UTC 时间戳?
我的示例源代码如下:
import java.time.Instant;
import java.util.Date;
public class UTCTimeDisplayer {
public static void main(String[] args) {
System.out.println(System.getProperty("os.name"));
Date currentUtcTime = Date.from(Instant.now());
System.out.println("Current UTC time is " + currentUtcTime);
}
}
Run Code Online (Sandbox Code Playgroud)
窗口输出:
C:\tmp>java UTCTimeDisplayer
Windows 10
Current UTC time is Fri Jan 22 14:28:59 GMT-06:00 2021
Run Code Online (Sandbox Code Playgroud)
Linux输出:
/tmp> java UTCTimeDisplayer
Linux
Current UTC time …Run Code Online (Sandbox Code Playgroud) 尝试在 Date 中设置时区(我知道 Date 已弃用)
LOG.error(modifiedDate + "Date in service"); //Mon Sep 21 06:15:00 CDT 2020
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.ENGLISH);
format.setTimeZone(TimeZone.getDefault());
String dateString = format.format(modifiedDate);
LOG.error(dateString + " dateString"); //2020-09-21 06:15:00 -0500
Date date = format.parse(dateString);
LOG.error(date + " date after parsing"); //Mon Sep 21 06:15:00 CDT
Run Code Online (Sandbox Code Playgroud)
解析后时区没有改变,我错过了什么?
我在 Java 中遇到 Date 和 SimpleDateFormat 对象的一些问题。我知道我需要在 Java 8 中使用新的日期和时间 API 来切换它们,我想这样做,但我有一个问题。当我从数据库中检索我的日期时(它是 SimpleDateFormat 并且我无法更改它),并且当我想添加一些小时(例如下午 4 点),然后我需要在用户从下拉列表中选择的时区中(假设美国/加拉加斯),所以我希望美国/加拉加斯的结果是 16 小时,但在我的情况下是 16 小时 UTC + UTC 和美国/加拉加斯之间的差异。这是我的代码:
Date startDate -> it's value is Tue Feb 23 20:00:00 CET 2021
Date date = new SimpleDateFormat("yyy-MM-dd").format( startDate + 4:00PM + America/Caracas);
Run Code Online (Sandbox Code Playgroud)
但是,奇怪的是,这种格式化广告 4 PM 值但不知何故忽略了时区的那部分。所以,相反,我在美国/加拉加斯有 20 小时,我在 UTC 时间有 20 小时。有人可以帮助我吗?