내 앱은 UTC로 DateTime 개체를 가져오고 EST 형식의 문자열로 출력해야합니다. 다음 코드를 시도했지만 출력을 얻으면 오프셋이 여전히 -05 : 00 대신 +00 : 00으로 표시됩니다.
static void Main(string[] args)
{
var currentDate = DateTime.Now.ToUniversalTime();
var convertedTime = ConvertUtcToEasternStandard(currentDate);
Console.WriteLine(currentDate.ToString("yyyy-MM-ddTHH:mm:sszzz"));
Console.WriteLine(convertedTime.ToString("yyyy-MM-ddTHH:mm:sszzz"));
}
private static DateTime ConvertUtcToEasternStandard(DateTime dateTime)
{
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
return TimeZoneInfo.ConvertTimeFromUtc(dateTime, easternZone);
}
결과는 다음과 같습니다.
2016-11-18T06:56:14+00:00
2016-11-18T01:56:14+00:00
따라서 시간이 올바르게 이동되고 있지만 오프셋은 -05 : 00이 되길 원할 때 +00 : 00으로 유지됩니다. 위의 형식 문자열로 출력 할 때 올바른 오프셋으로 DateTime 개체를 얻는 방법에 대한 아이디어가 있습니까?
얼마 전에 API 에서 이것을 읽었습니다 . 기본적으로 DateTime
값 으로 zzz
형식 오프셋을 유용한 것으로 얻는 것은 매우 불가능 합니다.
DateTime 값을 사용하는 "zzz"사용자 지정 형식 지정자는 UTC에서 로컬 운영 체제 표준 시간대의 서명 된 오프셋을 나타내며 시간과 분으로 측정됩니다. 인스턴스의 DateTime.Kind 속성 값을 반영하지 않습니다. 이러한 이유로 "zzz"형식 지정자는 DateTime 값에 사용하지 않는 것이 좋습니다.
DateTimeOffset 값을 사용하는 경우이 형식 지정자는 UTC로부터의 DateTimeOffset 값 오프셋 (시간 및 분)을 나타냅니다.
오프셋은 항상 선행 기호와 함께 표시됩니다. 더하기 기호 (+)는 UTC보다 앞선 시간을 나타내고 빼기 기호 (-)는 UTC보다 늦은 시간을 나타냅니다. 한 자리 오프셋은 선행 0으로 형식화됩니다.
예를 들어, 나는 동부 표준시 이고 이것이 내 결과입니다.
2016-11-18T07:9:38-05:00
2016-11-18T02:9:38-05:00
분명히 UTC 시간에는 오프셋이 없어야합니다 -05:00
.
코드를 약간 수정하면 해결책이 있습니다.
void Main()
{
var currentDate = DateTimeOffset.Now.ToUniversalTime();
var convertedTime = ConvertUtcToEasternStandard(currentDate);
var format = "yyyy-MM-ddTHH:m:sszzz";
Console.WriteLine(currentDate.ToString(format));
Console.WriteLine(convertedTime.ToString(format));
}
// Define other methods and classes here
private static DateTimeOffset ConvertUtcToEasternStandard(DateTimeOffset dateTime)
{
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
return TimeZoneInfo.ConvertTime(dateTime, easternZone);
}
결과:
2016-11-18T07:17:46+00:00
2016-11-18T02:17:46-05:00
그게 더 비슷합니다.
참고 : 이전 코드를 대체하고 무지가 제게 최선을 다했고 제대로 작동하지 않는다는 사실을 깨닫지 못했습니다. TimeZoneInfo.ConvertTime
소요 DateTimeOffset
우리가 원하는 것을 수행한다.
다음에 대한 다른 케이스를 추가하면 Pacific Standard Time
:
private static DateTimeOffset ConvertUtcToPacificStandard(DateTimeOffset dateTime)
{
var pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
return TimeZoneInfo.ConvertTime(dateTime, pacificZone);
}
올바른 결과를 얻습니다.
2016-11-17T23:21:21-08:00
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다