programing

내 날짜 시간을 UTC로 변환하는 중 문제 발생

css3 2023. 8. 13. 09:55

내 날짜 시간을 UTC로 변환하는 중 문제 발생

모든 날짜를 UTC 형식으로 데이터베이스에 저장하고 있습니다.저는 사용자에게 시간대를 물어보고 그들의 시간대를 사용하고 싶습니다. 그리고 제가 추측하는 것은 그들을 위한 UTC를 알아내는 서버 시간입니다.

그런 다음 새로 변환된 UTC 날짜를 사용하여 데이터베이스의 범위를 검색하고 싶습니다.

하지만 저는 항상 이 예외를 받습니다.

System.ArgumentException was unhandled by user code  
Message="The conversion could not be completed because the   
supplied DateTime did not have the Kind property set correctly.  
For example, when the Kind property is DateTimeKind.Local,   
the source time zone must be TimeZoneInfo.Local.  
Parameter name: sourceTimeZone"

제가 왜 이걸 받는지 모르겠어요.

나는 두 가지 방법을 시도했습니다.

 TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
 // I also tried DateTime.UtcNow
 DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); 
 var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone );

실패해서 노력했습니다.

 DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); 
 var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, 
                                           ZoneId, TimeZoneInfo.Utc.Id);

이 또한 동일한 오류로 인해 실패했습니다.내가 뭘 잘못하고 있는 거지?

편집이 가능할까요?

 DateTime localServerTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
 TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(id);

 var usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);

 var utc = TimeZoneInfo.ConvertTimeToUtc(usersTime, userInfo);

편집 2 @ 존 스키트

네, 저는 제가 이 모든 것을 할 필요가 없을지도 모른다는 생각을 하고 있었습니다.시간 문제가 지금 저를 혼란스럽게 하기 때문에 게시물이 그래야 할 만큼 명확하지 않을 수 있습니다.도대체 무슨 데이트 시간인지 모르겠어요.지금 시간이 점점 길어지고 있습니다(시간대를 다른 시간대로 변경하려고 시도했는데 계속 현지 시간을 받았습니다).

이것이 제가 이루고 싶었던 것입니다. 사용자가 사이트에 와서 약간의 경고를 추가하면 UTC(DateTime 이전)로 저장됩니다.이제, 누군가가 모든 것을 UTC에 저장하자고 제안했습니다.

따라서 사용자가 제 사이트를 방문하기 전에 호스팅 서버가 어디에 있는지에 따라 다음 날과 같을 수 있습니다.따라서 경보가 8월 30일(그들의 시간)에 표시되지만 서버의 시간 차이로 8월 29일에 표시될 수 있으며 경보가 표시됩니다.

그래서 저는 그것을 다루고 싶었습니다.그래서 이제는 현지 시간만 저장하고 이 오프셋을 사용해야 하는지 잘 모르겠습니다.또는 UTC 시간을 저장합니다.UTC 시간을 저장하는 것만으로도 사용자는 여전히 현지 시간으로 생각하고 있을 것이고 UTC가 실제로 어떻게 작동하는지 확신할 수 없기 때문에 여전히 틀릴 수 있습니다.시간 차이로 끝날 수도 있습니다.

편집3

 var info = TimeZoneInfo.FindSystemTimeZoneById(id)

 DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
                                             TimeZoneInfo.Utc, info);

은 야해합니다설을 .KindUnspecified다음과 같이:

DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);

DateTimeKind.Local다른 표준 시간대가 아닌 현지 시간대를 의미합니다.그래서 오류가 발생한 것입니다.

DateTime구조체는 두 개의 시간대만 지원합니다.

  • 시스템이 실행 중인 로컬 표준 시간대입니다.
  • 및 UTC.

DateTimeOffset 구조를 확인합니다.

var info = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

DateTimeOffset localServerTime = DateTimeOffset.Now;

DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);

DateTimeOffset utc = localServerTime.ToUniversalTime();

Console.WriteLine("Local Time:  {0}", localServerTime);
Console.WriteLine("User's Time: {0}", usersTime);
Console.WriteLine("UTC:         {0}", utc);

출력:

Local Time:  30.08.2009 20:48:17 +02:00
User's Time: 31.08.2009 03:48:17 +09:00
UTC:         30.08.2009 18:48:17 +00:00

다른 사람들의 대답은 너무 복잡해 보입니다.저는 특정 요구 사항이 있었고 이것은 저에게 잘 작동했습니다.

void Main()
{
    var startDate = DateTime.Today;
    var StartDateUtc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.SpecifyKind(startDate.Date, DateTimeKind.Unspecified), "Eastern Standard Time", "UTC");
    startDate.Dump();
    StartDateUtc.Dump();
}

어떤 것이 (linqpad에서) 내가 예상했던 것을 출력합니까?

12/20/2013 오전 12:00:00

12/20/2013 오전 5:00

지정되지 않은 종류 팁에 대한 슬랙에 대한 속성입니다.그게 제가 놓치고 있던 거예요.하지만 두 종류의 날짜(로컬과 UTC)만 있다는 모든 이야기는 저에게 문제를 혼란스럽게 했습니다.

참고로, 제가 이것을 실행한 기계는 중앙 표준 시간대에 있었고 DST는 작동하지 않았습니다.

dtb가 말하는 것처럼, 당신은 다음을 사용해야 합니다.DateTimeOffset특정 표준 시간대를 사용하여 날짜/시간을 저장하려는 경우.

하지만, 당신이 정말로 필요로 하는 것이 당신의 게시물에서 전혀 분명하지 않습니다.다음을 사용하여 예를 제시합니다.DateTime.Now그리고 당신은 당신이 서버 시간을 사용하고 있다고 추측한다고 말합니다.당신은 실제로 몇 시를 원합니까?현재 시간을 UTC로 지정하려면 다음을 사용합니다.DateTime.UtcNow또는DateTimeOffset.UtcNow현재 UTC 시간을 알기 위해 표준 시간대를 알 필요는 없습니다. 정확히는 범용 시간대이기 때문입니다.

다른 방법으로 사용자로부터 날짜/시간을 수신하는 경우 추가 정보를 제공하십시오. 그러면 필요한 작업을 파악할 수 있습니다.아니면 그냥 추측하는 겁니다

UTC는 모두가 표준 시간대로 합의한 시간대일 입니다.구체적으로, 영국 런던을 포함하는 시간대입니다.편집: 정확히 동일한 시간대가 아닙니다. 예를 들어 UTC에는 DST가 없습니다. (존 스키트 감사합니다.)

UTC의 유일한 특별한 점은 에서 사용하기가 훨씬 쉽다는 것입니다.다른 시간대보다 순(DateTime.UtcNow,DateTime.ToUniversalTime기타 회원).

따라서, 다른 사람들이 언급했듯이, 당신이 할 수 있는 최선의 방법은 당신의 데이터베이스 내에 모든 날짜를 UTC에 저장한 다음, 사용자의 현지 시간으로 변환하는 것입니다.TimeZoneInfo.ConvertTime(time, usersTimeZone)표시하기 전에


좀 더 세련되고 싶다면, 사용자의 IP 주소를 위치를 지정하여 사용자의 시간대를 자동으로 추측할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1354516/having-problems-with-converting-my-datetime-to-utc