- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Java Bean 中有一个字段,如下所示 @JsonFormat
是 jackson 注解:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm")
private Timestamp createdOn;
Timestamp
,它总是在我的 JSON 响应中转换为 UTC 时间。让我们说格式化我的 Timestamp ,我得到
2017-09-13 15:30
但我的回复返回为
2017-09-13 10:00
.
Asia/Calcutta
时区,因此偏移量为
+05:30
,Jackson 映射器减去 5 小时 30 分钟将时间戳转换为 UTC)
2017-09-13 15:30
而不是
2017-09-13 10:00
?
最佳答案
我这里做了个测试,把JVM默认时区改成Asia/Calcutta
并使用 java.sql.Timestamp
创建一个类 field :
public class TestTimestamp {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
private Timestamp createdOn;
// getter and setter
}
Timestamp
对应于
2017 年 9 月 13 日上午 10 点,UTC :
TestTimestamp value = new TestTimestamp();
// timestamp corresponds to 2017-09-13T10:00:00 UTC
value.setCreatedOn(Timestamp.from(Instant.parse("2017-09-13T10:00:00Z")));
ObjectMapper
序列化了:
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(value);
String
是:
{"createdOn":"2017-09-13 10:00"}
value = om.readValue(s, TestTimestamp.class);
System.out.println(value.getCreatedOn());
2017-09-13 15:30:00.0
Timestamp::toString()
方法(在
System.out.println
中隐式调用)打印 JVM 默认时区中的时间戳。在这种情况下,默认值为
Asia/Calcutta
, 和
世界标准时间上午 10 点 与
相同15:30 在加尔各答 ,所以产生了上面的输出。
Timestamp
对象没有任何时区信息。它只有自 unix 纪元以来的纳秒数(
1970-01-01T00:00Z
或“UTC 时间 1970 年 1 月 1 日午夜”)。
value.getCreatedOn().getTime()
的值,你会看到它是
1505296800000
- 这是自纪元以来的毫秒数(要获得纳秒精度,有方法
getNanos()
)。
Timestamp
区域之间,因为毫秒值在世界各地都是相同的。
com.fasterxml.jackson.databind.JsonSerializer
和
com.fasterxml.jackson.databind.JsonDeserializer
),因此您可以更好地控制格式化和解析日期的方式。
Timestamp
的序列化程序。到 JVM 默认时区:
public class TimestampSerializer extends JsonSerializer<Timestamp> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
public void serialize(Timestamp value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
// get the timestmap in the default timezone
ZonedDateTime z = value.toInstant().atZone(ZoneId.systemDefault());
String str = fmt.format(z);
gen.writeString(str);
}
}
Timestamp
:
public class TimestampDeserializer extends JsonDeserializer<Timestamp> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
public Timestamp deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// parse to a LocalDateTime
LocalDateTime dt = LocalDateTime.parse(jsonParser.getText(), fmt);
// the date/time is in the default timezone
return Timestamp.from(dt.atZone(ZoneId.systemDefault()).toInstant());
}
}
// remove JsonFormat annotation
@JsonSerialize(using = TimestampSerializer.class)
@JsonDeserialize(using = TimestampDeserializer.class)
private Timestamp createdOn;
Timestamp
上面(对应于
2017-09-13T10:00:00Z
)。序列化它会产生:
{"createdOn":"2017-09-13 15:30"}
Asia/Calcutta
中的 15:30)。
Timestamp
(对应于 UTC 时间上午 10 点)。
Region/City
格式,如
Asia/Calcutta
或
Europe/Berlin
),因此您可以使用
ZoneId.of("Asia/Calcutta")
创建它们.
IST
或
PST
),因为它们是
ambiguous and not standard .
ZoneId.getAvailableZoneIds()
获取可用时区列表(并选择最适合您系统的时区)。 .
ZoneId.systemDefault()
到你想要的区域。请记住,必须使用同一个区域来进行序列化和反序列化,否则会得到错误的结果。
java.time
而在 ThreeTen Backport 中是
org.threeten.bp
),但是类和方法
姓名 是相同的。
Timestamp
类有方法
toInstant()
和
from()
, 所以你需要使用
org.threeten.bp.DateTimeUtils
进行转换的类:
public class TimestampSerializer extends JsonSerializer<Timestamp> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
public void serialize(Timestamp value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
// get the timestmap in the default timezone
ZonedDateTime z = DateTimeUtils.toInstant(value).atZone(ZoneId.systemDefault());
String str = fmt.format(z);
gen.writeString(str);
}
}
public class TimestampDeserializer extends JsonDeserializer<Timestamp> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
public Timestamp deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// parse to a LocalDateTime
LocalDateTime dt = LocalDateTime.parse(jsonParser.getText(), fmt);
// the date/time is in the default timezone
return DateTimeUtils.toSqlTimestamp(dt.atZone(ZoneId.systemDefault()).toInstant());
}
}
关于java - java - 如何在Java中使用Jackson Annotation按原样反序列化时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46163246/
我的问题是 this one. 的一个分支 我有一个要验证的注释(比如电话注释)。我可以使用@phone 验证器来检查电话对象是否有效。我还希望能够将此验证器放在包含电话的联系信息对象上。有没有一种方
我的问题是 this one. 的一个分支 我有一个要验证的注释(比如电话注释)。我可以使用@phone 验证器来检查电话对象是否有效。我还希望能够将此验证器放在包含电话的联系信息对象上。有没有一种方
例如 class LoggingService [Inject] (protected val logger: Logger) class LoggingService @Inject (protec
你觉得你是java高手吗? 您是否深谙反射 API 的 secret ? public @interface @a {} public @interface @b {} @Mark public @i
我对 Spring 和 JUnit 非常陌生。我正在尝试为 spring 服务类运行一个简单的 JUnit 测试用例,但它失败了,我得到了这个异常。我还没有编写任何测试,但在实现之前尝试运行。使用to
对于spring和JUnit来说是非常新的东西。 我正在尝试为spring服务类运行一个简单的JUnit测试用例,但是失败了,并且出现了这个异常。我还没有编写任何测试,但是尝试在实现之前进行测试。 使
我有一个实体Test,它将从特征中获取它的属性(和基本方法): class Test { use Trait_title; } trait Trait_title{ /** *
我(当然)正在尝试使用许多我不太了解的构造来维护一个项目。在尝试弄清楚 Spring 中 AOP 使用的过程中,我遇到了带有以下注释的方法: @Around(value = "@annotation(
目前我正在编写一个注释处理器,它将生成新的源代码。该处理器与应用程序本身隔离,因为它是构建项目的一个步骤,我将整个构建系统与应用程序分开。 这就是问题开始的地方,因为我想处理在应用程序中创建的注释。我
我将 Vertx Service Gen 注释处理器与 Kotlin kapt 结合使用。 在注释处理器启动之前,我的 kapt 失败,到处都是以下异常消息: error: scoping const
我很难弄清楚如何从其实际实现类中获取对 java.lang.annotation.Annotation 的引用。 注释本身看起来像这样(来自框架): @Target({ElementType.TYPE
如何创建类似的注释 @Table(name="batch", uniqueConstraints= @UniqueConstraint(columnNames = {"compound_id"
我刚开始使用Spring Boot,我收到这个错误已经有一段时间了,不幸的是无法修复它。从那时起,我一直在谷歌上搜索,但仍然找不到我做错了什么。在我的代码下面找到:。实体。刀。主要。误差率。启动App
输出文本: Execution failed for task ':app:checkDebugDuplicateClasses'. 1 exception was raised by worker
假设我想使用宏注释来复制@specialized(Int) 之类的注释——我知道这很疯狂。像这样的东西: class expand(expanded: Any*) extends Annotation
假设我想使用宏注释来复制@specialized(Int) 之类的注释——我知道这很疯狂。像这样的东西: class expand(expanded: Any*) extends Annotation
注解处理过程中我目前正在处理一个方法的注解: @Override public boolean process(Set elements, RoundEnvironment env) { Mess
我有接口(interface)资源和几个实现它的类,例如音频、视频...此外,我创建了自定义注释MyAnnotation: @MyAnnotation(type = Audio.class) cl
我的项目包括较旧的未注释 Controller 和较新的基于注释的 Controller 。 我使用的是最新的 Spring jar (3.0.5),在我的 dispatcher-servlet.xm
我正在写一些简单的 win32 东西,我正在使用以下 wWinMain int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
我是一名优秀的程序员,十分优秀!