Java-创建没有时区的日历
我想首先说,我读过几篇类似于这篇文章的文章,但没有一篇真正解决了我的问题。 我还要声明,我曾尝试使用Java-创建没有时区的日历,java,datetime,timezone,Java,Datetime,Timezone,我想首先说,我读过几篇类似于这篇文章的文章,但没有一篇真正解决了我的问题。 我还要声明,我曾尝试使用SimpleDateFormat和joda.DateTime,但没有成功 问题如下: 我有一个日历对象,它保存关于特定日期的信息:2008-04-30T00:00:00Z 使用calendar.getTime()方法时,我可以得到不同的结果,因为我知道该方法正在查找本地值 因此: 但是我想得到一个Date对象,它只保存日期和时间值“2008-04-30T00:00:00”,完全忽略任何时区 我该怎
SimpleDateFormat
和joda.DateTime
,但没有成功
问题如下:
我有一个日历对象,它保存关于特定日期的信息:2008-04-30T00:00:00Z
使用calendar.getTime()方法时,我可以得到不同的结果,因为我知道该方法正在查找本地值
因此:
但是我想得到一个Date对象,它只保存日期和时间值“2008-04-30T00:00:00”,完全忽略任何时区
我该怎么做
正如我之前提到的,我试图使用
SimpleDateFormat sf=新的SimpleDateFormat(“yyyy-MM-dd'T'HH:MM:ss”)
但我总是得到同样的结果
任何帮助都将不胜感激
干杯。您是否使用标准构造函数初始化日历?如果使用允许指定时区和区域设置的构造函数,会怎么样
protected Calendar(TimeZone zone, Locale aLocale)
日历
和日期
如果没有时区
就没有任何意义
日历和日期如果没有时区,就不能存在
你不能完全忽略任何时区
您可以创建格林威治标准时间(偏移量为零)的日历,如下所示:
TimeZone zone = TimeZone.getTimeZone("Etc/GMT");
Calendar cal = Calendar.getInstance(zone);
这表示仅在GMT时区中有意义的日期/日历
听起来你想要一个时间戳,它代表时间上的一个瞬间。很旧,但仍然不正确
“使用calendar.getTime()方法时,我可以得到不同的结果,因为我知道该方法正在查找本地值”
这是一种误解。getTime()将仅获取毫秒。以格林尼治标准时间计算
只有在格式化输出时,时区才变得相关。由于原始海报没有显示代码,因此无法确定错误发生的位置。发现您可以使用以下代码清除时区:
Calendar cal=Calendar.getInstance();
校准清除(日历区域偏移)
正如其他人所指出的,日历
和日期
对象如果没有时区就不可能存在
我相信您可能希望将Java 8中引入的类与新的时间API一起使用:
LocalDateTime literal = LocalDateTime.of(2008, 4, 30, 0, 0, 0);
LocalDateTime parsed = LocalDateTime.parse("2008-04-30T00:00:00"); // ISO-8601 by default
Assert.assertEquals(literal, parsed);
您能提供您尝试过的示例吗?我尝试过以下方法:SimpleDataFormat sf=new SimpleDataFormat(“yyy-MM-dd'T'HH:MM:ss”);sf.setTimeZone(TimeZone.getTimeZone(“UTC”));解析(值)//值为'2008-04-30T00:00:00Z'您不能拥有没有时区的日历。日历的概念取决于时区,否则它就没有意义了。实际上我也尝试过这样做:Calendar.getInstance(timezone\UTC,Locale.UK);但它返回的值与:UK:2008-04-30T01:00:00.000+0100相同。每个日历实例都将始终具有与其关联的时区。这就是它们的工作原理。这实际上帮助了我-这在我们不需要关心时区的应用程序中非常有用。除了时区-我们还可以清除很多其他内容,如-小时,分钟,毫秒-所有这些字段都可以在这里找到这是一个狗屎答案,因为你可以清楚地使用没有时区的日期,然后使用带有清除时区信息的日历来实际处理值。如果应用程序只存在于一个时区中,则可以安全地忽略时区。问题是,当您得到一个日期
值并且忽略该日期的时区时(您得到的是长值)日历
将被您的时区关闭,与所有操作相关。
LocalDateTime literal = LocalDateTime.of(2008, 4, 30, 0, 0, 0);
LocalDateTime parsed = LocalDateTime.parse("2008-04-30T00:00:00"); // ISO-8601 by default
Assert.assertEquals(literal, parsed);