C# 更改DateTime的时区以满足API约定

C# 更改DateTime的时区以满足API约定,c#,.net-core,C#,.net Core,我有一个大摇大摆的客户。令人惊讶的是,API期望所有日期参数都精确地在UTC+02:00,并且不能仅处理提供的时区信息。现在无论我做什么,我都不能得到正确的时区(+02:00)。以下代码始终打印+01:00,与我提供的时区无关 TimeZoneInfo.ConvertTime(新的日期时间(2020,1,8,0,0,DateTimeKind.Utc),TimeZoneInfo.FindSystemTimeZoneById(“亚洲/马加丹”)。ToString(“zzz”) 正如我前面提到的,这

我有一个大摇大摆的客户。令人惊讶的是,API期望所有日期参数都精确地在UTC+02:00,并且不能仅处理提供的时区信息。现在无论我做什么,我都不能得到正确的时区(+02:00)。以下代码始终打印+01:00,与我提供的时区无关

TimeZoneInfo.ConvertTime(新的日期时间(2020,1,8,0,0,DateTimeKind.Utc),TimeZoneInfo.FindSystemTimeZoneById(“亚洲/马加丹”)。ToString(“zzz”)
正如我前面提到的,这是一个生成的客户端,我无法控制它。所以我不能乱用json序列化程序。 API:

事务的id。不是独一无二的。如果未提供,将自动生成。 }

当我调用API时,我得到一个异常:

{“errors”:[{“errorCode”:4,“errorSource”:“日期组织偏移量为+02:00的值2020-01-08T23:00:00+01:00的无效日期偏移量”,“errorReason”:“无效参数”}]}

如果我使用2020-01-08T23:00:00+02:00对api进行卷曲,则一切正常


很明显,这是他们的一个bug(即使示例中的日期也是+03:00)。然而,我不能等待他们为我解决这个问题,我需要找到一个解决办法(至少是中间的)。生成的客户端使用RestSharp序列化json(
Newtonsoft.json.JsonConvert
)。

尽可能避免
DateTime
,而是使用:

var sourceOffset=TimeSpan.Zero;//UTC
var source=新的DateTimeOffset(2020,1,8,0,0,0,sourceOffset);
代码的其余部分不会更改:

var timezone=TimeZoneInfo.FindSystemTimeZoneById(“亚洲/马加丹”);
var timezoneStr=TimeZoneInfo.ConvertTime(源,时区).ToString(“zzz”);
这将给出
+11:00
(这对于以下情况是正确的)。 如果需要将Magadan时间转换为UTC+2,则需要相应地更改偏移和目标时区


例如,下面是如何转到当前由
Africa/Cairo
时区观察到的UTC+2:

var utcPlus2=TimeZoneInfo.FindSystemTimeZoneById(“非洲/开罗”);
var converted=TimeZoneInfo.ConvertTime(目标,utcPlus2);
var dateTime=converted.dateTime;

现在,
dateTime
值将是
1/8/2020 2:00:00 AM
——这是正确的,因为
1/8/2020 0:00:00 AM UTC
1/8/2020 2:00 AM UTC+2
。请注意,虽然您无法从
DateTime
实例中获得正确的时区,但时间值本身是正确的。

很抱歉,不是python,可能“DateTime”是一个错误的标记,因为它也是python模块,我删除了它it@funie200这不是python问题,这是否回答了您的问题?Linux,是的,这是我喜欢的另一个.net特性,每个.net的时区.Id都不同OS@KIC问题还不清楚。JSON甚至没有日期。使用ISO8601存储日期是一种惯例。您的日期要么包含偏移量,要么不包含偏移量。您可以序列化任何您想要的表单。你到底想要哪一个?谢谢!不幸的是,虽然这样做很好,但客户端只接受
DateTime
,如果我接受
time.DateTime
,我会再次遇到同样的问题。看起来我被困了…@KIC-JSON甚至没有日期,所以这个语句没有多大意义-没有
只接受DateTime
。按照惯例,ISO8601格式的字符串被视为日期。您的日期是连续的,没有偏移量,或者包含偏移量。是哪一个?如果您需要偏移量,它是哪一个?您可以将任何DateTime或DateTimeOffset转换为另一个。生成的swagger客户端生成所有DTO并负责内部的转换。您不能将json传递给api,只能传递给DTO。这些DTO是基于DateTime对象构建的。PS我不是客户机的生成器,我只是简单地将assembly.Off主题大幅度删除,但除了.NET的
DateTime
和非标准化区域名称的额外风格之外,我总是要考虑。@KIC你误解了JSON和Swagger的做法。JSON或Swagger中没有
DateTime
。您看到的只是一个生成的DTO,甚至不是Swagger/JSON模式本身。您可以轻松地修改它,服务器将理解新值-除非他们明确指定接受带有隐含的
+2:00
偏移量的本地时间。你还没有给出一个期望值的例子,你描述了期望值产生的东西。DTO不是JSON模式本身
List<GLJournalEntry> Create (PostGLJournalEntriesDTO body, string idempotencyKey = null);
"PostGLJournalEntriesDTO":{
         "type":"object",
         "properties":{
              "date":{
               "type":"string",
               "format":"date-time",
               "example":"2016-09-06T13:37:50+03:00",
               "description":"Date/time stamp when the entries were recorded (Booking Date)"
            
},
            "branchId":{
               "type":"string",
               "description":"The id of the assigned branch for the journal entries"
            
},
            "notes":{
               "type":"string",
               "description":"Optional notes entered by the user when they performed the journal entry log"
            
},
            "credits":{               "type":"array",
               "description":"The list of GL Accounts to be credited with the corresponding amounts",
               "items":{
                  "$ref":"#/definitions/GLAccountAmount"
               
}
            
},
            "debits":{               "type":"array",
               "description":"The list of GL Accounts to be debited with the corresponding amounts",
               "items":{
                  "$ref":"#/definitions/GLAccountAmount"
               
}
            
},
            "transactionId":{
               "type":"string",
               "description":"An id for the transaction. Not unique. Will be auto generated if not provided."
            
}
         
},
         "description":"The representation of a payload for creating GL Journal Entries"
      
}