SimpleDateFormat setTimeZone 不起作用

2024-02-12

我使用下面的代码将时间转换为UTC哪个正在工作

import java.text.SimpleDateFormat;
import static java.util.Calendar.* 

def dt = "2018-03-19T06:00:00+01:00"
def format = "yyyy-MM-dd'T'HH:mm:ssX"

TimeZone tz  = TimeZone.getDefault(); //getting up local time zone
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
SimpleDateFormat sdf = new SimpleDateFormat(format);      
Date d = sdf.parse(dt);
TimeZone.setDefault(tz);

println d //output: 2018-03-19T05:00:00Z

println d.toTimestamp(); //Output: 2018-03-19 06:00:00.0

但是当我使用TimeZone.setTimeZone(TimeZone.getTimeZone("UTC"));然后它不起作用。

它仅适用于TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

Why so?

评论后更新:输出需要采用 CET,但采用 UTC

def dt = "2018-03-19T06:00:00+01:00"
def format = "yyyy-MM-dd'T'HH:mm:ssX"
SimpleDateFormat sdf = new SimpleDateFormat(format);      
sdf.setTimeZone(TimeZone.getTimeZone("CET"))
Date d = sdf.parse(dt);

println d
println d.toTimestamp();

​ 输出:

Mon Mar 19 05:00:00 UTC 2018
2018-03-19 05:00:00.0

java.time

    String dt = "2018-03-19T06:00:00+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(dt);
    System.out.println(dateTime);

这打印

2018-03-19T06:00+01:00

与过时的相反Date类,一个OffsetDateTime from java.time,现代 Java 日期和时间 API,确实包含 UTC 偏移量,正如其名称所示。我没有使用 Groovy 的经验,因此很抱歉必须信任您来翻译我的 Java 代码。

如果您想确保获得特定时区,无论字符串中的偏移量如何:

    ZoneId zone = ZoneId.of("Europe/Brussels");
    ZonedDateTime dateTime = OffsetDateTime.parse(dt).atZoneSameInstant(zone);

这次的结果是:

2018-03-19T06:00+01:00[欧洲/布鲁塞尔]

不要依赖 CET 等三字母时区缩写。 CET 是许多欧洲时区标准时间一半(没有夏令时/DST 的部分)的通用名称,这些时区通常共享时间,但并不总是这样做,并且在涉及历史日期时往往在时间上存在分歧。其他三个字母的缩写是不明确的,因此会导致更多的混乱。始终将时区指定为地区/城市,就像我对欧洲/布鲁塞尔所做的那样。当然,选择与您所需时区相匹配的城市。

如果您认为您需要一个java.sql.Timestamp——你可能不需要那个。如果使用 JDBC 4.2 或更高版本或类似的现代 JPA 实现,最好存储Instant or a LocalDateTime到您的数据库。选择取决于您的具体要求以及数据库列的具体数据类型。

    Instant inst = dateTime.toInstant();
    System.out.println(inst);

Output

2018-03-19T05:00:00Z

Instant始终以 UTC 格式打印。如果足够新的 JDBC 驱动程序不可用,您可以转换为Timestamp有两种方式之一:

    System.out.println(Timestamp.from(inst));
    System.out.println(Timestamp.valueOf(dateTime.toLocalDateTime()));

2018-03-19 06:00:00.0
2018-03-19 06:00:00.0

由于我的时区与日期时间对象中的时区一致,因此两次转换得到的结果相同。在其他时区,结果可能会有所不同,您需要小心选择正确的结果。

你的代码出了什么问题?

当你使用SimpleDateFormat为了解析其中包含 UTC 偏移量的字符串,它使用该偏移量来确定时间点。在这种情况下,它不使用您设置的时区setTimeZone为了任何东西。并且它不会将任何时区或偏移量放入Date它返回是因为Date不能包含时区。这只是一个时间点。

让很多人感到困惑的是,结果Date.toString()似乎包含时区缩写,如输出中的 UTCMon Mar 19 05:00:00 UTC 2018。发生的事情是这样的toString()使用 JVM 的时区设置来生成字符串。这就是为什么TimeZone.setDefault()影响你得到的输出:它设置 JVM 设置,影响在同一 JVM 中运行的所有程序。它不影响Date然而,对象本身只是其结果toString().

The TimeZone, Date and Timestamp课程早已过时。SimpleDateFormat太麻烦了,同时也是出了名的麻烦。我建议你根本不要使用这些类。java.time合作起来更加愉快。

Link

Oracle 教程:日期时间 https://docs.oracle.com/javase/tutorial/datetime/解释如何使用java.time.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SimpleDateFormat setTimeZone 不起作用 的相关文章

  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐