미국 동부 시간 과 베 이 징 시간 이 서로 바 뀌 는 실현 코드 를 분석 하 다.

미 동부 시간 은 UTC-5 시간 대,베 이 징 시간 은 UTC+8 시간 대로,정상 적 인 경우 미 동시 간이 베 이 징 시간 보다 13 시간 늦다.주의해 야 할 것 은 미국 에 여름 캠프 가 있 고 베 이 징 에 여름 캠프 가 없 을 때 미국 여름 은 시간 을 한 시간 빨리 보 내 고 국민 들 을 일찍 일어나 게 하기 때문에 미국 에서 여름 캠프 를 실시 할 때 미 동 시간 은 베 이 징 시간 보다 12 시간 늦다 는 것 이다.논 리 는 위 에서 말 한 바 와 같이 코드 는 다음 과 같다

/// <summary>
/// AMESTime :
///
/// 
/// UTC-5 , , , UTC-4 
/// (UTC+8 ) 13 , 12
/// 
/// 
/// 2005 , : 2007 3 , 11 。
/// </summary>
public class AMESTime
{
    private static DateTime _thisYearDaylightSavingTimeStart,
        _thisYearDaylightSavingTimeEnd;

    private const int TIMEZONE_OFFSET_DAY_SAVING_LIGHT = -12;
    private const int TIMEZONE_OFFSET = -13;

    public static DateTime BeijingTimeToAMESTime(DateTime beijingTime)
    {
        int offsetHours = (IsNowAMESDayLightSavingTime ? TIMEZONE_OFFSET_DAY_SAVING_LIGHT:TIMEZONE_OFFSET);

        return beijingTime.AddHours(offsetHours);
    }

    public static DateTime AMESNow
    {
        get
        {
            return BeijingTimeToAMESTime(DateTime.Now);
        }
    }

    /// <summary>
    ///
    /// 2007 3 , 11 。
    /// </summary>
    /// <returns> , true, false</returns>
    public static bool IsNowAMESDayLightSavingTime
    {
        get
        {
            return DateTime.UtcNow > DayLightSavingStartTimeUtc
                && DateTime.UtcNow < DayLightSavingEndTimeUtc;
        }
    }

    /// <summary>
    ///
    /// </summary>
    static DateTime DayLightSavingStartTimeUtc
    {
        get
        {
            if(_thisYearDaylightSavingTimeStart.Year != DateTime.Now.Year)
            {
                DateTime temp = new DateTime(DateTime.Now.Year,3,8,0,0,0);
                while(temp.DayOfWeek != DayOfWeek.Sunday)
                {
                    temp = temp.AddDays(1);
                }
                _thisYearDaylightSavingTimeStart = temp.AddHours(TIMEZONE_OFFSET);
            }

            return _thisYearDaylightSavingTimeStart;
        }
    }

    /// <summary>
    ///
    /// </summary>
    static DateTime DayLightSavingEndTimeUtc
    {
        get
        {
            if(_thisYearDaylightSavingTimeEnd.Year != DateTime.Now.Year)
            {
                DateTime temp = new DateTime(DateTime.Now.Year,11,1,0,0,0);
                while(temp.DayOfWeek != DayOfWeek.Sunday)
                {
                    temp = temp.AddDays(1);
                }
                _thisYearDaylightSavingTimeEnd = temp.AddHours(TIMEZONE_OFFSET_DAY_SAVING_LIGHT);
            }
            return _thisYearDaylightSavingTimeEnd;
        }
    }
}
.

좋은 웹페이지 즐겨찾기