Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-更改我的类中的所有时区属性_Java_Date_Timezone - Fatal编程技术网

Java-更改我的类中的所有时区属性

Java-更改我的类中的所有时区属性,java,date,timezone,Java,Date,Timezone,我需要在运行时更改DTO的每个时区。 今天,当用户在我的web服务上执行请求时,时区由参数通知,我想知道是否可以为所有日期属性应用新时区。 我唯一不能使用的是“TimeZone.setDefault(myTimeZone)”,因为这种方法适用于所有JVM,并且不同时区的用户如何存在这个解决方案是不可行的 我试着这样做: Query query = em.createNativeQuery(SQL.toString(), AgendamentoDTO.class); collection = qu

我需要在运行时更改DTO的每个时区。 今天,当用户在我的web服务上执行请求时,时区由参数通知,我想知道是否可以为所有日期属性应用新时区。 我唯一不能使用的是“TimeZone.setDefault(myTimeZone)”,因为这种方法适用于所有JVM,并且不同时区的用户如何存在这个解决方案是不可行的

我试着这样做:

Query query = em.createNativeQuery(SQL.toString(), AgendamentoDTO.class);
collection = query.setParameter(1, idEmpresa).getResultList();

for (Field atributo : AgendamentoDTO.class.getDeclaredFields()) {
    if (atributo.getType().isAssignableFrom(Date.class)) {
        //Change time zone here
    }
}
Tks

避免设置默认时区 正如问题中明智的建议,您应该将JVM当前的默认时区设置为最危急情况下的最后手段。设置默认值会影响在该JVM中运行的所有应用程序的所有线程中的所有代码,并在执行时立即影响它们(!)

相反,在所有日期时间工作中,始终将可选时区参数传递给各种方法。永远不要隐式地依赖JVM的当前默认区域

避免旧的日期时间类 与最早版本的Java捆绑在一起的旧的遗留日期时间类被证明是设计糟糕、麻烦和混乱的。避开它们。现在被java.time类取代

因此,不要使用
java.util.Date
,而是使用
java.time.Instant
。该类表示时间线上的一个时刻,分辨率为。这个
Instant
类是日期时间处理的基本构造块。经常使用这个类,因为您的大部分业务逻辑、数据存储、数据交换和数据库工作都应该在其中。不要认为UTC只是时区上的另一个变化,相反,要认为UTC是一个真实的时间。在编程时,忘记你自己的本地时区,因为狭隘的思维会混淆你的编程

Instant
一般来说,您的web服务应该接受并提供UTC值。
Instant
类可以直接解析并生成字符串,以标准格式表示这些值

因此,无需操纵这些UTC值。让他们留在附近。数据提供服务在很大程度上应与UTC保持一致

在您的情况下,作为的DTO应该坚持存储UTC值(要么是
Instant
对象,要么是一个ISO 8601格式的字符串,UTC格式,末尾是
Z
),DTO在缺乏业务对象的意义上应该是“哑的”,而应该仅仅传输基本数据元素。使用这些DTO的其他对象应该处理任何需要的时区分配

ZoneDateTime
在其他时区生成字符串,仅用于向用户演示。在这里,我们指定魁北克省的一个时区,通过一个不同的视角来看待这一时刻。应用
ZoneId
以获取
zoneDateTime
ZoneDateTime
Instant
都代表了历史上的同一时刻,时间线上的同一点

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
请注意,我们在业务对象中保留了
即时
对象,未经修改。我们为不同的挂钟时间生成一个不同的单独对象,
zoneDateTime

  • 在代码中指定这些时区时,传递
    ZoneId
    对象
  • 通过web服务API指定这些时区分配时,请将时区名称作为字符串传递。始终以
    大陆/地区
    的格式使用,如或
    太平洋/奥克兰
    。切勿使用3-4个字母的缩写,如
    EST
    IST
    ,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
生成字符串 当您的web服务将数据用作数据而不是表示时,请以格式生成字符串。默认情况下,java.time类使用这些标准格式来解析和生成字符串。只需调用
toString
即可生成标准格式的字符串。请注意,
ZonedDateTime
通过在方括号中添加时区名称扩展了标准格式

String output = instant.toString();  // 2016-09-09T22:34:08Z
String output = zdt.toString();  // 2016-09-09T19:34:08-03:00[America/Montreal]
当您的web服务将信息提供给用户而不是作为数据使用时,请以适合用户的人类语言和文化规范的格式生成字符串。您可以指定特定的格式。但通常最好让java.time为您自动本地化

Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );

为了更清楚,你是否考虑使用一个标准时区?说UTC?既然你提到你的呼叫者给出了时区,他们可以转换成UTC吗?这样JVM和不同时区的用户就不重要了?谢谢你的回答。日期将始终与默认时区(UTC)一起保存,但是,如果要发出请求,将保留用户的UTC时区转换。
Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );