2015-01-09 16 views
9

Cách được khuyến nghị để tạo một cá thể LocalDate đại diện cho "hôm nay" là gì. Tôi đã mong đợi có một tài sản "Bây giờ" hoặc "Hôm nay" tĩnh trong lớp LocalDate, nhưng không có. Cách tiếp cận hiện tại của tôi là sử dụng DateTime.Now:Tạo một LocalDate của NodaTime đại diện cho "hôm nay"

var now = DateTime.Now; 
LocalDate today = new LocalDate(now.Year, now.Month, now.Day); 

Có cách nào tốt hơn không?

Trả lời

15

Trước tiên, hãy nhận ra rằng khi bạn nói "hôm nay", câu trả lời có thể khác với những người khác nhau ở các nơi khác nhau trên thế giới. Do đó, để có được ngày địa phương hiện tại, bạn phải ghi nhớ múi giờ.

Thời gian Noda mô hình hóa chính xác điều này bằng cách cung cấp cho bạn Instant khi bạn gọi Now từ triển khai IClock chẳng hạn như đồng hồ hệ thống. Ngay lập tức là phổ biến, vì vậy bạn chỉ cần chuyển đổi nó thành một số múi giờ để nhận được ngày địa phương của múi giờ đó.

// get the current time from the system clock 
Instant now = SystemClock.Instance.Now; 

// get a time zone 
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Tokyo"]; 

// use now and tz to get "today" 
LocalDate today = now.InZone(tz).Date; 

Đó là mã tối thiểu. Tất nhiên, nếu bạn muốn sử dụng múi giờ địa phương của máy tính (như bạn đã làm với DateTime.Now), bạn có thể nhận được nó như vậy:

DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); 

Và để thực sự thực hiện nó đúng cách, bạn nên gọi .Now từ giao diện IClock , như vậy bạn có thể thay thế đồng hồ hệ thống bằng đồng hồ giả cho các bài kiểm tra đơn vị của mình.

Đây là ví dụ tuyệt vời về cách Noda Time cố ý không che giấu mọi thứ với bạn. Tất cả điều này vẫn đang diễn ra dưới mui xe khi bạn gọi DateTime.Now, nhưng bạn chỉ không nhìn thấy nó. You can read more about Noda Time's design philosophy in the user guide.

11

Câu trả lời của Matt được phát hiện tại thời điểm Noda 1.x.

Trong thời gian Noda 2.0, tôi giới thiệu một số ZonedClock, về cơ bản là sự kết hợp của IClock và một số DateTimeZone. Vì bạn có thể muốn thời gian hiện tại trong cùng một múi giờ nhiều lần, bạn có thể tiêm (tôi giả sử bạn đang sử dụng tiêm phụ thuộc) và giữ lại, sau đó sử dụng nó. Ví dụ:

class SomeClass 
{ 
    private readonly ZonedClock clock; 

    internal SomeClass(ZonedClock clock) 
    { 
     this.clock = clock; 
    } 

    internal void DoSomethingWithDate() 
    { 
     LocalDate today = clock.GetCurrentDate(); 
     ... 
    } 
} 

Bạn sẽ thường cung cấp các ZonedClock bằng cách lấy một IClock và bằng một trong những phương pháp khuyến nông mới, ví dụ

var clock = SystemClock.Instance; 
var zoned = clock.InUtc(); 
// Or... 
var zoned = clock.InZone(DateTimeZoneProviders.Tzdb["Europe/London"]; 
// Or... 
var zoned = clock.InTzdbSystemDefaultZone(); 
// Or... 
var zoned = clock.InBclSystemDefaultZone(); 

Lưu ý rằng mã 1.x của bạn sẽ không làm việc trong 2.x anyway - Tôi tháo Now tài sản từ IClock vì nó thực sự không phải là một tài sản (cho cách thức mà nó thay đổi) - nó bây giờ là một phương pháp GetCurrentInstant() .;

+0

Tôi thích nó. 2.0 là tìm kiếm tốt hơn tất cả các thời gian! –

Các vấn đề liên quan