2015-11-01 60 views
5

Tôi mới sử dụng NodaTime và tôi muốn triển khai nó trong ứng dụng của mình.Làm thế nào để phân tích cú pháp chuỗi ngày thành đối tượng NodaTime?

Tôi làm cách nào để phân tích chuỗi ngày thành đối tượng NodaTime?

Dưới đây là những gì tôi hiện có:

var dateInput = "06/11/2015"; 
var pattern = InstantPattern.CreateWithInvariantCulture("dd/MM/yyyy"); 
var parseResult = pattern.Parse(dateInput); 
var localDate = parseResult.Value; 
DateTimeZone tzNZ = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 
ZonedDateTime result = localDate.InZone(tzNZ); 

biến LOCALDATE của tôi bây giờ là 2015-11-06T00:00:00Z (và dựa trên những gì tôi đọc trong Format ISO, có Z trong phần cuối cùng chỉ ra rằng đó là UTC)

kết quả của tôi biến bây giờ là 2015-11-06T13:00:00 NZ (+13)

Nhưng tôi không chắc chắn liệu mình có đang đi đúng hướng hay không.

Đây là những gì tôi thực sự muốn.

  1. Chuyển đổi (chuỗi ngày) dateInput đến một đối tượng NodaTime với định dạng sau dd/MM/yyyy
  2. Và sau đó có nó như là UTC sau đó chuyển sang một loại long dữ liệu sau đó lưu nó vào cơ sở dữ liệu
  3. Sau đó cố gắng truy xuất dữ liệu đã lưu, sau đó sử dụng múi giờ cụ thể. Nói Asia/Hong_Kong

Có thể không?

EDIT

var dateInput = "06/11/2015"; 
var pattern = LocalDatePattern.CreateWithInvariantCulture("dd/MM/yyyy"); 
LocalDate parseResult = pattern.Parse(dateInput).Value; 
DateTimeZone tzHK = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 
LocalTime time = GetTimeOfDay(); 
LocalDateTime localDateTime = parseResult + time; 

// change it to UTC then convert it to 
// long data type then save it to the database 

// methods 
private LocalTime GetTimeOfDay() 
{ 
    var instant = SystemClock.Instance.Now; 
    var tz = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 

    return instant.InZone(tz).TimeOfDay; 
} 

Tôi có đoạn này và kịch bản này, nơi người dùng có thể chỉ đầu vào date nói 06/11/2015 sau đó khi lưu nó vào cơ sở dữ liệu, tôi cần bây giờ là lúc hiện tại (thời điểm hiện tại của người sử dụng) để xem mục đích. Lý do tại sao tôi chuyển đổi nó thành long là bởi vì tôi đang sử dụng Khung thực thể.

Điều này có được khuyến khích không?

+0

Câu hỏi về chỉnh sửa của bạn - Tại sao bạn có họ nhập ngày hoàn toàn trong trường hợp này? Điều đó có vẻ như bạn đang định thời gian đặt hàng với ngày và giờ hiện tại. –

+0

@MattJohnson Đây chỉ là một ý tưởng tôi đã đưa ra. và tôi nhận ra nó không có ý nghĩa gì cả. Tôi nghĩ tôi cần xóa nó. –

+0

Vâng, nếu bạn chỉ là dấu thời gian, thì không có phần còn lại nào trong số này được áp dụng, vì bạn sẽ chỉ sử dụng 'SystemClock.Instance.Now' để có được' Instant' dựa trên UTC hiện tại. Hoặc chỉ cần sử dụng 'DateTime.UtcNow', hoặc chức năng tương tự trong db của bạn, và sau đó bạn sẽ không cần Noda Thời gian cả. –

Trả lời

5

Tôi sẽ trả lời từ góc độ hơi khác. Bạn nói rằng bạn đã chuyển đổi thành long vì bạn đang sử dụng Khung thực thể. Điều đó có lẽ không cần thiết.

Có vẻ như bạn đang cố gắng làm tròn một ngày theo lịch. Nếu không có thời gian cụ thể liên quan (chẳng hạn như nửa đêm, hoặc bắt đầu trong ngày) và bạn muốn tất cả người dùng xem cùng một tháng và ngày bất kể họ đang ở múi giờ nào thì sẽ tốt hơn (IMHO) giữ mọi thứ trong những điều khoản đó trong suốt toàn bộ quá trình.

Một số người cho rằng chống lại điều này, với thông lệ tốt nhất thông thường là "luôn lưu trữ trong UTC", nhưng lời khuyên rằng không nắm giữ lên trong hai kịch bản phổ biến:

  1. "Tôi đã có một địa phương ngày và thời gian, nhưng chúng trong tương lai và tôi đang sử dụng chúng cho mục đích lên lịch. "

  2. "Tôi chỉ đang làm việc với ngày dương lịch mà không có thời gian trong ngày, có thể là quá khứ hoặc tương lai, nhưng đó là ngày dân sự tập trung vào con người, chứ không phải là một khoảnh khắc duy nhất kịp thời."

Bạn dường như trong trường hợp thứ hai Vì vậy:.

  • Sử dụng một loại ngày chỉ trong cơ sở dữ liệu của bạn, chẳng hạn như các loại DATE sẵn trong SQL Server, PostgreSQL, MySQL, Oracle, và hầu hết các cơ sở dữ liệu quan hệ khác.

  • Sử dụng một loại LocalDate trong Noda Time. Đừng cố gắng để chuyển nó sang Instant, LocalDateTime, ZonedDateTime hoặc long.

  • Sử dụng một loại DateTime (với .Kind == DateTimeKind.Unspecified) để hoạt động như một trung gian giữa cơ sở dữ liệu và thuộc tính LocalDate của bạn. Điều này thường được thực hiện với mẫu "thuộc tính buddy", như đã thấy in this answer.

+0

Lưu ý, tôi đang đưa ra một vài giả định trong câu trả lời của mình. Nếu bạn thực sự không chỉ cố gắng làm tròn một ngày theo lịch, hãy cho tôi biết và tôi sẽ xóa hoặc sửa lại phản hồi của tôi. cảm ơn. –

+0

Ồ, vì vậy tôi có thể sử dụng một cái gì đó giống như cách tiếp cận của bạn để sử dụng 'DATE' và lưu trữ' DATE' chỉ trong cơ sở dữ liệu và đừng lo lắng về quy tắc "luôn luôn lưu trữ trong UTC"? Tôi luôn nghĩ và dựa trên những gì tôi đọc, rằng bạn nên luôn luôn lưu trữ trong UTC. Tôi chưa bao giờ nghĩ có một ngoại lệ. Tôi không thực sự chắc chắn 'chuyến đi khứ hồi' ngày lịch là gì. –

+0

Vâng, đó là ý tôi. "chuyến đi khứ hồi" là ý tưởng bạn lấy lại giá trị chính xác mà bạn đã lưu hoặc truyền đi. Nó bắt đầu bằng chuỗi "" 2015-11-01 "', được lưu vào cơ sở dữ liệu dưới dạng '2015-11-01' và có thể được tải từ cơ sở dữ liệu với cùng giá trị. (Cái gì đó không vòng chuyến đi sẽ giống như thiết lập 'DateTimeKind.Utc', mà không được lưu vào cơ sở dữ liệu, do đó, sẽ là' DateTimeKind.Unspecified' trên trở lại.) –

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