2011-02-21 59 views
5

Tôi muốn sản xuất Partials từ Strings, nhưng không thể tìm thấy bất kỳ thứ gì trong API hỗ trợ điều đó. Rõ ràng, tôi có thể viết trình phân tích cú pháp của riêng tôi bên ngoài khung thời gian Joda và tạo các Partials, nhưng tôi không thể tưởng tượng rằng API không có khả năng làm điều này.Phân tích cú pháp Joda-Time Partials

Sử dụng threeten (JSR-310) sẽ là giải pháp có thể chấp nhận được, nhưng dường như không hỗ trợ Partials. Tôi không biết liệu đó có phải là do trạng thái alpha của nó hay không hoặc liệu khái niệm một phần có được xử lý theo cách khác, mà tôi chưa phát hiện ra hay không.

Cách tốt nhất để chuyển đổi một chuỗi (2011, 02/11, vv) thành một phần là gì?

Trả lời

2

Tôi đã mở rộng DateTimeParserBucket. Lớp mở rộng của tôi chặn các cuộc gọi đến các phương thức saveField(), và lưu trữ kiểu trường và giá trị trước khi ủy quyền cho siêu. Tôi cũng đã triển khai một phương thức sử dụng các giá trị trường được lưu trữ đó để tạo một phần.

Tôi có thể chuyển thể hiện nhóm của mình tới DateTimeParser.parseInto(), sau đó yêu cầu tạo một phần.

Nó hoạt động, nhưng tôi không thể nói rằng tôi ấn tượng với Joda-Time - cho rằng nó không hỗ trợ phân tích cú pháp Partials ra khỏi hộp. Việc thiếu DateTimeFormatter.parsePartial (String) là một thiếu sót rõ ràng.

+2

bạn vui lòng chia sẻ mã của bạn? tôi có một trường hợp sử dụng cho chức năng này và rất thích một sự khởi đầu. – RubyTuesdayDONO

1

Bạn phải bắt đầu bằng cách xác định định dạng hợp lệ cho Phần mà bạn sẽ chấp nhận. Không có lớp nào chỉ lấy văn bản và phỏng đoán kết quả phù hợp nhất có thể cho một phần. Đó là cách quá chủ quan dựa trên ngôn ngữ, sở thích người dùng, vv Vì vậy, không có cách nào để có được xung quanh làm cho một danh sách của tất cả các định dạng hợp lệ cho đầu vào. Nó sẽ rất khó khăn để làm cho tất cả các loại trừ lẫn nhau cho nhau, vì vậy cần có ưu tiên. Ví dụ: bạn có thể muốn mm/ddmm/yy cho cả hai đều là định dạng hợp lệ. Nếu tôi cung cấp cho bạn chuỗi 02/11, chuỗi nào phải được ưu tiên?

Khi bạn đã xác định chính xác định dạng hợp lệ, bạn nên sử dụng DateTimeFormat.forPattern để tạo một DateTimeFormatter cho mỗi định dạng. Sau đó, bạn có thể sử dụng từng trình định dạng để thử parseInto một MutableDateTime. Sau đó, đi qua từng trường trong MutableDateTime và chuyển giá trị vào một số Partial.

Thật không may, không có cách nào tốt hơn để xử lý điều này trong thư viện Joda.

+0

Đó là những gì tôi đã sợ. Tôi sẽ không viết mã để chuyển đổi DateTimes cho mỗi định dạng thành Partials. Ngay cả một lớp chấp nhận danh sách trường, và sử dụng thông tin đó để tạo trình định dạng và sau đó thực hiện chuyển đổi sau đó là quá nhiều của một hack. Nếu bạn biết một cách để trích xuất danh sách kiểu trường từ trình định dạng, thì tôi có thể viết một phương thức chấp nhận trình định dạng và DateTime, trả về một phần. Nếu không, tôi sẽ đi với giải pháp Bucket của tôi hoặc gắn bó với mã cũ của tôi. – user371320

+0

Tôi không thấy nơi bạn có bất kỳ tùy chọn nào khác. –

1

Các ISODateTimeFormat lớp allows in một phần. Như bạn nói, không có phương pháp phân tích cú pháp trên DateTimeFormatter (mặc dù bạn có thể phân tích cú pháp thành một số LocalDate và giải thích điều đó).

ThreeTen/JSR-310 có lớp DateTimeFields thay thế Partial. Việc phân tích cú pháp partials thành CalendricalMerger được hỗ trợ, tuy nhiên có thể không được chuyển đổi trở lại thành DateTimeFields.

+0

có vấn đề mở cho điều này: https://sourceforge.net/tracker/?func=detail&aid=3280815&group_id=97367&atid=617892 – RubyTuesdayDONO

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