시스템의 LocalDateTime 에 Noda 시간
문제
무엇이 유용한 방법으로 시스템의 시간으로 LocalDateTime
에 Noda 시간입니까?가장 직접적인 방법을 생각하의 것
var dt = DateTime.Now
LocalDateTime systemTime = new LocalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);
하지만 주어진 노다 시간 전체 목적은 교체 DateTime 무언가에있는 더 좋은 의미, 정이 있었 선호하는 방법이 사용하는 것보다 DateTime
위의 방식이다.최고의 내에 오를 수 있을 사용하여 Noda 의 시설
var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;
하지만 이것은 아주 자세한 정보를 표시합니다.
해결책
당신의 두 번째 예는 정확히 어떻게 당신이 이것을 할 것입니다.그 도 자세한 정보를 표시합니다.보 Noda 시의 디자인 철학.
그것의 생각에는 세 가지 부분
현재 순간에 시간:
// Instant now = SystemClock.Instance.Now; // NodaTime 1.x Instant now = SystemClock.Instance.GetCurrentInstant(); // NodaTime 2.x
시스템의 시간대에 있습니다.(선호되는 구문)
DateTimeZone tz = DateTimeZoneProviders.Bcl.GetSystemDefault();
적용되는 시간대를 즉시:
ZonedDateTime zdt = now.InZone(tz);
당신의 마지막 단계에서 얻어 LocalDateTime
는 사실을 인식하는 당신이 그것을 할 때,당신은 벗겨 모든 시간대 정보입니다."로컬에서"NodaTime 가 지 의"로컬 컴퓨터 코드는 실행하는".(다시 말해,그것과 같지는 않지 DateTimeKind.Local
)
추가적인 것들에 대해 생각:
수도 있습을 추상적인 시계를 사용하는
IClock
인터페이스::IClock clock = SystemClock.Instance; // Instant now = clock.Now; // NodaTime 1.x Instant now = clock.GetCurrentInstant(); // NodaTime 2.x
그런 다음 전달할 수 있습에서 시계 방법으로 매개 변수 또는 주사 그것으로 좋아하는 DI/IoC framework.(Autofac,Ninject,StructureMap 무엇이든,...).이점은 다음을 사용할 수 있다
NodaTime.Testing.FakeClock
의 단위 테스트를 확인할 수 있습니다보 단위 테스트 Noda 시간 자세한 내용은.수도 있습니다호에서 통과하기
DateTimeZone
그래서 당신이 할 수 있는 코드를 실행하지 않고 어디서나 연결되는 시스템의 시간대에 있습니다.이것은 중요 서버 응용 프로그램을 위해,그러나 더 적은 그렇게 데스크탑/모바일 앱입니다.이 있는 경우 다른 작업의를 사용하여 IANA 시간 영역,또는 당신이 사용하는 경우.NET 표준 빌드의 Noda 시간를 변경한 다음,2 단계를 사용하여
Tzdb
공급자:DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
이 TZDB 지역은 훨씬 더 많은 정확한 보다 BCL 영역이 있습니다.Noda 것입니다 시간이 지도하시스템의 창(BCL)시간대에는 IANA(TZDB)시간 영역에서 이러한 초기 호출합니다.
이 있는 경우 호기심으로 이유 DateTime.Now
은 그렇게 컴팩트하는 동안 노다 시간은 그렇게 자세한 정보려고,decompiling DateTime.Now
나 보 MS reference sources.당신이 볼 수는 그것의 일을 기본적으로 동일한 단계를 수행합니다.