2016-11-03 3 views
0

구조체 이름을 DateTimeZone으로 설정하고, UTC 시간을 사용하도록 설정하고 현지 시간으로 가져옵니다.Date Time 구조체가 다른 시간대를 처리하기 위해

DateTimeZone time = DateTime.Now;//time will equal the UTC time 
    DateTime localTime= time; // local time will equal the Local time 

구조체

public struct DateTimeZone 
{ 
    private DateTime dateTime; 

// public DateTimeZone Value { get; } 

    public static implicit operator DateTimeZone(DateTime value) 
    { 
     return new DateTimeZone() { dateTime = value.ToUniversalTime() }; 
    } 

    public static implicit operator DateTime(DateTimeZone value) 
    { 
     return value.dateTime.ToLocalTime(); 
    } 
} 

내 질문 : 구조체보다이를 구현하는 가장 쉬운 방법은 무엇입니까? 이 구조체는 DB에 저장할 때 엔티티 프레임 작업을 수행 할 때 예외가 발생하므로 구조체를 사용할 때마다 매핑을 만들어야합니다. 어떻게 간결하게 매핑 할 수 있습니까?

+2

'DateTime'이 시간대 _awareness_입니다. 솔직히 뭘 하려는지 명확하지는 않지만 DateTime을위한 더 나은 API 인 [Nodatime] (http://nodatime.org/)을 사용하는 것이 좋습니다. –

+0

감사합니다. 시간대 문제가 있습니다. 따라서 DB에 항상 utc 시간을 저장해야하고 UI를 표시 할 때 로컬 시간을 가져야합니다. 질문을 수정합니다. – Jala

답변

1

몇 가지 :

  • 은 당신의 이름에주의하십시오. DateTimeZone과 같은 이름을 가진 객체는 1) 표준 시간대 정보 만 또는 2) 날짜 및 시간과 표준 시간대 중 하나를 포함해야합니다. 귀하의 개체는 DateTime 주변의 캡슐화 래퍼이므로 이러한 것은 아닙니다.

  • 암시 적 조작은 악의적 일 수 있습니다. 특히 암시 적 조작은 작업중인 값의 의미를 변경하는 경우 특히 위험 할 수 있습니다. 정말로이 무엇을하는지 알지 못한다면 날짜/시간과 함께 사용하지 않는 것이 좋습니다. 이 개체의 사용자가 실제로 작업 한 가치에 관해서는 혼란 스러울 것입니다.

  • ToUniversalTimeToLocalTime 기능은 작업중인 DateTime 개체의 .Kind 속성에 할당 된 DateTimeKind에 따라 자신의 행동을 변경합니다. 항상 DateTime이 로컬이고 DateTimeZone은 항상 UTC 인 API를 만드는 것처럼 보이지만, DateTimeKind은이 아이디어를 얻게 될 것입니다.

  • 의견에서 언급했듯이 매우 견고하고 잘 고려 된 API 인 Noda Time을 사용할 수 있습니다. Noda Time에서 Instant 유형은 항상 UTC를 나타내고 LocalDateTime 유형은 항상 시간이없는 날짜와 시간을 나타냅니다. 시간대는 DateTimeZone (이름과의 충돌 참조)으로 표시되며 ZonedDateTime 유형은 이들을 결합하여 사용자가 즉석 정보, 현지 시간 정보 및 관련 시간대를 모두 가질 수 있도록합니다.

  • Entity Framework에 대해 언급했습니다. 불행히도 EF는 사용자 지정 개체 또는 Noda Time과 직접 작동하지 않습니다. 단순한 유형 변환을 수행 할 능력이 없습니다. 이것은 요청되었지만 아직 구현되지 않았습니다. You can follow the work item for it here. 사용할 수있는 해결 방법은 "친구 속성", as described here입니다. 그들은 재미 있지만, 그들은 작동하지 않습니다. 대개.

  • DateTime을 사용하고 필요하면 ToUniversalTime 또는 ToLocalTime과 같은 메서드를 수동으로 호출하는 것이 합리적 일 수 있습니다. 데이터베이스에서로드 할 때 EF에서 DateTimeKind을 올바르게 설정하려면 this answer을 참조하십시오.

  • ToUniversalTimeToLocalTime은 모두 코드가 실행되는 컴퓨터의 현지 시간대에서 작동한다는 점에 유의하십시오.이 기능은 데스크톱 및 모바일 응용 프로그램에서 잘 작동하지만 서버의 표준 시간대를 변경하면 데이터에 큰 영향을 줄 수 있으므로 웹 응용 프로그램에는 거의 적합하지 않습니다. Noda Time에 내장 된 TimeZoneInfo 클래스 또는 DateTimeZone 클래스를 사용하여 명명 된 표준 시간대로 작업하는 것을 고려해보십시오. 당신을 위해

추가 독서 과제 :

1

어쩌면 당신이 하나를 시도해야합니다

public struct DateTimeZone 
{ 
    public DateTime DateTime; 

    public static explicit operator DateTimeZone(DateTime dt) 
    { 
     return new DateTimeZone { DateTime = dt.ToUniversalTime() }; 
    } 
} 

var time = (DateTimeZone)DateTime.Now; 
var localTime = time.DateTime; 
관련 문제