Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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
C#ServiceStack和Java之间的日期时间格式_Java_C#_Datetime_Format_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Java,C#,Datetime,Format,servicestack" /> servicestack,Java,C#,Datetime,Format,servicestack" />

C#ServiceStack和Java之间的日期时间格式

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或[时区

我正在Visual Studio 2015中使用ServiceStack 4.5.6。 在我目前的情况下,我使用SS作为客户。 REST服务器由第三方公司用Java编写。 我编写了模型类、DTO等来匹配服务器的路由

但现在我有以下问题: 交换整数或字符串没有问题。但交换日期时间值似乎真的很困难

Java似乎使用了与C#/ServiceStack不同的日期时间格式字符串,我现在找不到一个通用的

以下是我从服务器开发人员那里得到的一些示例:

爪哇:

因此,在大多数情况下,Java会添加一个Z或[时区]。 我无法完全使用ServiceStack生成这些格式中的任何一种

例如,使用以下代码:

                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" ) ;