.NET/SQL Server에서 사용자의 현지 시간에 이메일을 보내는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/22319

  •  09-06-2019
  •  | 
  •  

문제

나는 매시간 정각에 사용자에게 로컬인 시간에 이메일을 보내야 하는 프로그램을 작성하고 있습니다.

서로 다른 시간대에 2명의 사용자가 있다고 가정해 보겠습니다.John은 뉴욕에 있고 Fred는 로스앤젤레스에 있습니다.서버는 시카고에 있습니다.각 사용자에게 현지 오후 6시에 이메일을 보내려면 서버 시간으로 오후 7시에 John에게, 서버 시간으로 오후 4시에 Fred에게 이메일을 보내야 합니다.

.NET/Sql Server에서 이에 대한 좋은 접근 방식은 무엇입니까?모든 시간대 정보가 포함된 xml 파일을 찾았으므로 이를 데이터베이스로 가져온 다음 쿼리하는 스크립트를 작성하는 것을 고려 중입니다.

편집하다: 나는 “t4znet.dll”을 사용했고 .NET 측에서 모든 비교를 수행했습니다.

도움이 되었습니까?

해결책

두 가지 옵션이 있습니다:

  • 메일 작업에 대해 조정된 시간을 각 사용자의 데이터베이스에 저장합니다.그런 다음 서버 시간과 저장된 시간을 비교하십시오.혼란과 이식성 문제를 피하기 위해 항상 UTC로 저장합니다.따라서 SERVER_UTC_TIME() == 저장된UtcTime일 때 메일을 보내세요.
  • 각 메일 작업의 현지 시간을 데이터베이스에 저장한 다음 즉시 변환합니다.SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone)일 때 메일을 보냅니다.

귀하의 애플리케이션에 가장 적합한 것이 무엇인지 결정해야 합니다.예를 들어 메일링 시간이 모든 사용자에게 항상 동일하다면 옵션 (2)를 선택하는 것이 더 합리적입니다.이벤트 시간이 사용자 간, 심지어 사용자별로 변경될 수 있는 경우 옵션 (1)을 선택하면 개발 및 디버깅이 더 쉬워질 수 있습니다.어느 쪽이든 사용자의 시간대를 알아야 합니다.

*이러한 함수 호출은 T-SQL에서의 호출을 모르기 때문에 분명히 의사 호출이지만 존재해야 합니다.

다른 팁

저는 PHP 개발자이므로 PHP에 대해 제가 알고 있는 내용을 공유하겠습니다..NET에도 비슷한 내용이 포함될 것이라고 확신합니다.

PHP에서는 서버 시간에 따라 시간대 차이를 얻을 수 있습니다. 서버에서 서로 다른 시간에 이메일을 보내겠다고 제안한 대로입니다.

사용자를 추가할 때마다 서버 시간(또는 서버 시간대가 변경되는 경우 해당 시간대)과의 시간 오프셋을 저장합니다.

그런 다음 업데이트를 지정할 때 이메일을 보내야 하는지 확인하기 위해 매 시간 실행되는 자동화된 작업(LAMP 사용자의 경우 Cron)을 사용하세요.보낼 이메일이 더 이상 남지 않을 때까지 이 작업을 수행하세요.

이 훌륭한 기사로 솔루션을 보완할 수 있습니다. "세계 시계 및 TimeZoneInformation 클래스", 저는 로컬 및 수신자 시간이 포함된 정보가 포함된 파일을 보내는 웹 서비스를 만들었습니다. 제가 한 일은 해당 문제를 처리할 수 있도록 이 클래스를 수정하는 것이었고 정확히 제가 필요로 했던 대로 완벽하게 작동했습니다.

나는 당신이 이 수업을 듣고 "사용자" 테이블에서 그들의 시간대를 얻고 적절한 시간을 "계산"할 수 있다고 생각합니다. 내 코드는 다음과 같습니다.

//Get correct destination time
DateTime thedate = DateTime.Now;

string destinationtimezone = null;

//Load the time zone where the file is going
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone);

//Calculate
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString();

이 클래스에는 Windows Vista에서 "FromIndex(int ​​index)" 함수와 충돌하는 문제가 있지만 함수를 사용하는 대신 코드를 수정할 수 있습니다.

    public static TimeZoneInformation FromIndex(int index)
    {
        TimeZoneInformation[] zones = EnumZones();

        for (int i = 0; i < zones.Length; ++i)
        {
            if (zones[i].Index == index)
                return zones[i];
        }

        throw new ArgumentOutOfRangeException("index", index, "Unknown time zone index");
    }

다음과 같이 변경할 수 있습니다.

    public static TimeZoneInformation FromName(string name)
    {
        TimeZoneInformation[] zones = EnumZones();

        foreach (TimeZoneInformation tzi in zones)
        {
            if (tzi.DisplayName.Equals(name))
                return tzi;
        }

        throw new ArgumentOutOfRangeException("name", name, "Unknown time zone name");
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top