Excel,212个字节
=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)
如果您将每个与号分割成几块,则会得到以下内容:
ABS()
从字符串的最后两个字符中提取日期。由于可能包含连字符,ABS
请将其转换为正号。
IF((ABS-12)<2,"th",SWITCH())
添加序数。该-12
位是因为11,12,13不遵循正常规则,它们都得到th
代替st
,nd
和rd
。对此进行了纠正。
- 注意:该
SWITCH
功能仅在Excel 2016及更高版本中可用。(Source)比CHOOSE
在这种情况下短,因为如果找不到匹配项,它可以返回一个值,而CHOOSE
需要数字输入,并且必须为每个可能的值都有一个对应的返回值。
TEXT(MID()*30," mmmm ")
提取月份名称。MID()
拉出月份数字作为字符串,然后乘以30将返回一个数字。Excel将该数字视为日期(1900-01-30、1900-02-29、1900-03-30等),并将TEXT()
其设置为月份名称,并在其两端均带有空格。28和29也可以,但30看起来“更黑”。
LEFT()
提取年份数字。
现在,考虑到所有这些,如果测试用例全部位于Excel可以作为实际日期处理的日期范围内,那将变得更加容易。最大的优点是整个日期可以立即格式化。该解决方案是133个字节:
=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")
另一个大障碍是必须包括序数。否则,解决方案仅为34个字节:
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
代替3rd