2014-12-08 23 views
23

Tôi đang sử dụng Moment.js trong dự án của tôi và định dạng ngày như sau:Locale và định dạng ngày tháng cụ thể với Moment.js

var locale = window.navigator.userLanguage || window.navigator.language; 
moment.locale(locale); 
someDate.format("L"); 

Nó hoạt động tốt nhưng đôi khi tôi cần hiển thị một ngày mà không năm. Tôi không thể sử dụng một cái gì đó như someDate.format("MM/DD") vì trong một số ngôn ngữ, nó phải là someDate.format("DD/MM"). Tôi cần một cái gì đó suy nghĩ như L,LL,LLL nhưng không có năm.

Tôi có thể làm gì?

LTS : 'h:mm:ss A', 
LT : 'h:mm A', 
L : 'MM/DD/YYYY', 
LL : 'MMMM D, YYYY', 
LLL : 'MMMM D, YYYY LT', 
LLLL : 'dddd, MMMM D, YYYY LT' 

Trả lời

17

OK. Đây là một chút khủng khiếp, nhưng bạn biết nó sẽ được.

Trước tiên, bạn có thể truy cập vào chuỗi định dạng thực tế cho (ví dụ) 'L':

var formatL = moment.localeData().longDateFormat('L'); 

Tiếp theo, bạn có thể thực hiện một số phẫu thuật về nó với sự thay thế regex đúng đắn:

var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,''); 

(Những là để nói: Xóa YYYY, cộng với dấu phân tách mồ côi còn lại bằng cách xóa)

Sau đó, bạn có thể sử dụng chuỗi định dạng mới trong một định dạng thời gian gọi:

someDate.format(formatYearlessL); 

này nhất thiết phải làm cho một số giả định:

  • Thứ tự của các tháng + ngày định dạng số cho một miền địa phương phù hợp với trật tự cho năm + tháng + định dạng ngày cho miền địa phương đó, với năm loại bỏ .
  • Biểu mẫu ngắn chỉ sử dụng dấu phân cách giữa tháng và ngày (không có dấu phân tách đầu/cuối).
  • Dấu phân cách cho định dạng ngày số ngắn luôn không phải là chữ số.
  • Định dạng bao gồm các phần tử số và dấu tách, thay vì định dạng dạng câu với các bài viết (xem nhận xét của RGPT bên dưới về tiếng Tây Ban Nha và tiếng Bồ Đào Nha, cũng sẽ áp dụng cho các định dạng dài bằng một số ngôn ngữ khác).

Khi xem xét nhanh locale/*.js, những giả định này đúng với mọi tệp miền địa phương mà tôi đã kiểm tra, nhưng có thể có một số ngôn ngữ vi phạm chúng. (ETA: một bình luận dưới đây chỉ ra rằng một định dạng ngày ngắn của Đức vi phạm các giả định thứ hai)

Như một thông báo quan trọng bổ sung, điều này có thể là mong manh. Hoàn toàn có thể là phiên bản tương lai của moment.js sẽ thay đổi vị trí của dữ liệu hiện tại trong longDateFormat ...

+0

tôi đồng ý với bạn, có vẻ như đó là một cách duy nhất cho bây giờ. Tôi hy vọng họ sẽ thêm nhiều định dạng hơn trong tương lai. – Jekyll

+5

Điều này sẽ không hoạt động trong một số nền văn hóa. Cho phép lấy tiếng Bồ Đào Nha làm ví dụ: Ngày đầy đủ sẽ là: "14 de Fevereiro de 2016".Nếu bạn chỉ xóa năm, trong trường hợp này "2016", bạn sẽ nhận được: "14 de Fevereiro de" sai. Kết quả chính xác nên là "14 de Fevereiro". Ít nhất là tiếng Tây Ban Nha chia sẻ cùng một vấn đề (vì vậy với hai chúng tôi đã nói về nhiều hơn thì 650 triệu người dùng có thể bị ảnh hưởng bởi lỗi này). Tôi thấy rằng các ngôn ngữ khác sẽ có cùng một vấn đề. – RGPT

+1

RGPT - điểm tốt, chỉnh sửa bài đăng để thêm vào đó để báo trước. Nói chung, cách tiếp cận này chỉ thích hợp khi bạn thay đổi định dạng ngày, số ngắn bằng dấu phân tách có thể dự đoán được. –

1

Theo tôi hiểu, bạn có thể thay đổi định dạng ngày (không có năm) cho các ngôn ngữ cụ thể bằng MomentJS tính https://momentjs.com/docs/#/customization/long-date-formats/

Ví dụ:

moment.updateLocale('en', { 
    longDateFormat: { 
    LLL: "MMMM Do, LT", // Oct 6th, 4:27 PM 
    } 
}); 

moment.updateLocale('ru', { 
    longDateFormat: { 
    LLL : 'D MMMM, HH:mm', // 6 окт., 16:27 
    } 
}); 
Các vấn đề liên quan