C#ServiceStack和Java之间的日期时间格式
我正在Visual Studio 2015中使用ServiceStack 4.5.6。 在我目前的情况下,我使用SS作为客户。 REST服务器由第三方公司用Java编写。 我编写了模型类、DTO等来匹配服务器的路由 但现在我有以下问题: 交换整数或字符串没有问题。但交换日期时间值似乎真的很困难 Java似乎使用了与C#/ServiceStack不同的日期时间格式字符串,我现在找不到一个通用的 以下是我从服务器开发人员那里得到的一些示例: 爪哇: 因此,在大多数情况下,Java会添加一个Z或[时区]。 我无法完全使用ServiceStack生成这些格式中的任何一种 例如,使用以下代码:C#ServiceStack和Java之间的日期时间格式,java,c#,datetime,format,
servicestack,Java,C#,Datetime,Format,
servicestack,我正在Visual Studio 2015中使用ServiceStack 4.5.6。 在我目前的情况下,我使用SS作为客户。 REST服务器由第三方公司用Java编写。 我编写了模型类、DTO等来匹配服务器的路由 但现在我有以下问题: 交换整数或字符串没有问题。但交换日期时间值似乎真的很困难 Java似乎使用了与C#/ServiceStack不同的日期时间格式字符串,我现在找不到一个通用的 以下是我从服务器开发人员那里得到的一些示例: 爪哇: 因此,在大多数情况下,Java会添加一个Z或[时区
using (var scope = JsConfig.BeginScope())
{
scope.DateHandler = DateHandler.ISO8601;
return client.Post(request);
}
我得到这个结果
2018-04-09T17:14:19.1201876+02:00
这看起来几乎像第一个java示例,但是纳秒太多了
我知道,我可以使用自定义格式,如下所述:
是否可以仅对特定的JsonServiceClient使用这种自定义格式?我无法在整个应用程序中全局使用它
致以最诚挚的问候,Daniel无法强制特定服务客户做出不同的响应 如果需要更改Java中的DateTime实现,可以使用自己的DateTime impl替换现有的DateTime impl,例如:
JsonServiceClient客户端=新的JsonServiceClient(baseUrl);
GsonBuilder GsonBuilder=client.getGsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class,新的JsonDeserializer()){
@凌驾
公共日期反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
返回json==null?null:Utils.parseDate(json.getAsString());
}
});
setGson(gsonBuilder.disableHtmlEscaping().create());
否则,确保精确格式化日期的另一种方法是将其序列化为C#中的字符串,并让DTO返回字符串。ISO 8601
我不能告诉你确切的细节,但我应该说,你最好的选择是格式,国际标准。您的示例字符串遵循此标准或接近此标准,因此我希望它是可行的
Java:您的前两个示例,2012-06-30T12:30:40+01:00
和2012-06-30T12:30:40Z
,如下所示。Z
是表示偏移量0的常用方法,它不会在任何地方造成任何问题。下一个示例中带时区的方括号是特定于Java的,只是它们也符合ISO。如果您收到这样的字符串,您将不得不去掉括号,或者只解析字符串,忽略任何未解析的字符。据我所知,在日期和时间之间缺少T
的字符串不符合要求
ServiceStack:2018-04-09T17:14:19.1201876+02:00
完全正确。Java接受这种格式应该没有问题。小数的数量是自由的(它们是可选的,允许存在或不存在)
我不知道ServiceStack,也不知道具体的Java服务器,所以这是我能得到的最接近的结果。此外,我建议简单地删除
[GMT]
,[UT]
和[UTC]
之后出现的Z
,然后按照答案所示进行处理。对于没有区域或偏移的问题中的最后两个例子,用“<代码> t>代码>替换中间的空间,并解析为缺少时区的任何概念或:<代码> LoalDATeTime.PARSE(“201611-05 13:45”)。替换(“”,“T”)< /代码>您是对的,谢谢。现在我将使用ISO8601格式,例如2018-04-09T17:14:19.1201876+02:00
我认为Java不会理解这种格式,因为示例中没有包含小数部分。但在与我们服务器的开发人员交谈后,这似乎不是问题。服务器端不使用ServiceStack,因此这没有帮助。但我现在将使用DateHandler.ISO8601。我想我发现了我的错误:在测试中,我使用了REST客户端邮递员。在那里我忘了编码+符号,所以我得到了奇怪的结果。
2018-04-09T17:14:19.1201876+02:00
JsonServiceClient client = new JsonServiceClient(baseUrl);
GsonBuilder gsonBuilder = client.getGsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return json == null ? null : Utils.parseDate(json.getAsString());
}
});
client.setGson(gsonBuilder.disableHtmlEscaping().create());
OffsetDateTime odt = OffsetDateTime.parse( "2018-04-09T17:14:19.1201876+02:00" ) ;