Excel, 212 byte
=ABS(RIGHT(A1,2))&IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th"))&TEXT(MID(A1,FIND("-",A1)+1,FIND("-",REPLACE(A1,1,FIND("-",A1),""))-1)*30," mmmm ")&LEFT(A1,FIND("-",A1)-1)
Nếu bạn chia nó thành nhiều phần tại mỗi ký hiệu, bạn sẽ nhận được các phần sau:
ABS()
kéo số ngày từ hai ký tự cuối cùng trong chuỗi. Vì có thể bao gồm một dấu gạch nối,ABS
chuyển đổi nó thành tích cực.
IF((ABS-12)<2,"th",SWITCH())
thêm thứ tự. Các -12
bit là vì 11, 12 và 13 không tuân theo các quy tắc bình thường và tất cả họ đều có được th
thay vì st
, nd
vàrd
. Điều này sửa cho điều đó.
- Lưu ý:
SWITCH
Chức năng chỉ khả dụng trong Excel 2016 trở lên. ( Nguồn ) Nó ngắn hơn CHOOSE
trong trường hợp này bởi vì nó có thể trả về một giá trị nếu không tìm thấy kết quả khớp nào trong khi CHOOSE
yêu cầu đầu vào số và phải có một trả về tương ứng cho mỗi giá trị có thể.
TEXT(MID()*30," mmmm ")
trích xuất tên tháng. MID()
lấy ra số tháng dưới dạng một chuỗi và nhân với 30 trả về một số. Excel xem số đó là một ngày (1900-01-30, 1900-02-29, 1900-03-30, v.v.) và TEXT()
định dạng nó dưới dạng tên tháng với một khoảng trắng ở cả hai đầu. 28 và 29 cũng sẽ hoạt động nhưng 30 trông "đẹp hơn".
LEFT()
trích số năm.
Bây giờ, với tất cả những điều đó, mọi thứ sẽ dễ dàng hơn nếu các trường hợp thử nghiệm đều nằm trong phạm vi ngày mà Excel có thể xử lý như một ngày thực tế: 1900-01-01 đến 9999-12-31. Ưu điểm lớn là toàn bộ ngày được định dạng cùng một lúc. Giải pháp đó là 133 byte :
=TEXT(DATEVALUE(A1),"d""" & IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th")) & """ mmmm yyyy")
Rào cản lớn khác là phải bao gồm cả thứ tự. Không có điều đó, giải pháp chỉ là 34 byte :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
thay vì3rd