我知道這會給我這個月的一天,一個數(11
,21
,23
):如何格式化當月的某天以說明「11th」,「21st」或「23rd」(有序指示符)?
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
但你如何格式化月份的一天,包括ordinal indicator,說11th
,21st
或23rd
?
我知道這會給我這個月的一天,一個數(11
,21
,23
):如何格式化當月的某天以說明「11th」,「21st」或「23rd」(有序指示符)?
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
但你如何格式化月份的一天,包括ordinal indicator,說11th
,21st
或23rd
?
// https://github.com/google/guava
import static com.google.common.base.Preconditions.*;
String getDayOfMonthSuffix(final int n) {
checkArgument(n >= 1 && n <= 31, "illegal day of month: " + n);
if (n >= 11 && n <= 13) {
return "th";
}
switch (n % 10) {
case 1: return "st";
case 2: return "nd";
case 3: return "rd";
default: return "th";
}
}
表:
Calendar c = Calendar.getInstance();
c.setTime(date);
int day = c.get(Calendar.DAY_OF_MONTH);
String dayStr = day + suffixes[day];
每評論通過@托爾比約恩-Ravn的安徒生,像這樣的表本地化時很有幫助來自@kaliatech是很好的,但是因爲重複了相同的信息,它會爲錯誤提供機會。在7tn
,17tn
和27tn
這個表中實際存在這樣的錯誤(由於StackOverflow的流動特性,此錯誤可能會隨着時間的推移而得到修復,因此請檢查the version history on the answer以查看錯誤)。
JDK沒有這樣做。
static String[] suffixes =
// 0 1 2 3 4 5 6 7 8 9
{ "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
// 10 11 12 13 14 15 16 17 18 19
"th", "th", "th", "th", "th", "th", "th", "th", "th", "th",
// 20 21 22 23 24 25 26 27 28 29
"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
// 30 31
"th", "st" };
Date date = new Date();
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
int day = Integer.parseInt(formatDateOfMonth.format(date));
String dayStr = day + suffixes[day];
或者使用日曆:
static String[] suffixes =
{ "0th", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th",
"10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th",
"20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th",
"30th", "31st" };
如果讓表格包含完整的「第21」,「第23」,「第29」,它可以被外化並本地化爲其他語言。對於可能成爲需求的成功軟件。 – 2010-10-25 02:59:44
String ordinal(int num)
{
String[] suffix = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
int m = num % 100;
return String.valueOf(num) + suffix[(m > 10 && m < 20) ? 0 : (m % 10)];
}
這樣做有一個更簡單和可靠的方法。你需要使用的函數是getDateFromDateString(dateString);它基本上刪除日期字符串的st/nd/rd/th並簡單地解析它。你可以改變你的SimpleDateFormat任何東西,這將工作。
public static final SimpleDateFormat sdf = new SimpleDateFormat("d");
public static final Pattern p = Pattern.compile("([0-9]+)(st|nd|rd|th)");
private static Date getDateFromDateString(String dateString) throws ParseException {
return sdf.parse(deleteOrdinal(dateString));
}
private static String deleteOrdinal(String dateString) {
Matcher m = p.matcher(dateString);
while (m.find()) {
dateString = dateString.replaceAll(Matcher.quoteReplacement(m.group(0)), m.group(1));
}
return dateString;
}
本答案是關於*解析*字符串,而問題是關於*生成*字符串。但仍然適合,因爲它可能需要兩個方向。此外,此答案解決[此其他問題](http://stackoverflow.com/q/33389982/642706)。 – 2015-10-28 18:38:59
private String getCurrentDateInSpecificFormat(Calendar currentCalDate) {
String dayNumberSuffix = getDayNumberSuffix(currentCalDate.get(Calendar.DAY_OF_MONTH));
DateFormat dateFormat = new SimpleDateFormat(" d'" + dayNumberSuffix + "' MMMM yyyy");
return dateFormat.format(currentCalDate.getTime());
}
private String getDayNumberSuffix(int day) {
if (day >= 11 && day <= 13) {
return "th";
}
switch (day % 10) {
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
public String getDaySuffix(int inDay)
{
String s = String.valueOf(inDay);
if (s.endsWith("1"))
{
return "st";
}
else if (s.endsWith("2"))
{
return "nd";
}
else if (s.endsWith("3"))
{
return "rd";
}
else
{
return "th";
}
}
與格雷格提供的解決方案唯一的問題是,它並沒有考慮與結束「青少年」的數字大於100的數字。例如,111應該是第111,而不是第111。這是我的解決方案:
/**
* Return ordinal suffix (e.g. 'st', 'nd', 'rd', or 'th') for a given number
*
* @param value
* a number
* @return Ordinal suffix for the given number
*/
public static String getOrdinalSuffix(int value)
{
int hunRem = value % 100;
int tenRem = value % 10;
if (hunRem - tenRem == 10)
{
return "th";
}
switch (tenRem)
{
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
在什麼情況下,日月序列會超過31天? – SatanEnglish 2014-01-30 21:58:30
@SatanEnglish,這種靜態工廠方法的好處在於它不僅可以用於獲取一個月的後綴。 :) – 2015-05-15 23:31:20
此方法返回st爲11,nd爲12和rd爲13 – TheIT 2015-06-08 18:37:33
以下是對問題的更有效的回答,而不是對風格進行硬編碼。
要將日期更改爲序號,您需要使用以下suffix。
DD + TH = DDTH result >>>> 4TH
OR to spell the number add SP to the format
DD + SPTH = DDSPTH result >>> FOURTH
找到我完成了答案this問題。
問題是在Java格式不Oracle數據庫 http://docs.oracle.com/cd/B12037_01/server.101/b10759/sql_elements004.htm#BABGDDFB 的Java使用的SimpleDateFormat日期: https://開頭docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html – 2015-08-25 10:50:59
如果您試圖瞭解i18n,解決方案會變得更加複雜。
問題是,在其他語言中,後綴可能不僅取決於數字本身,還取決於它的名詞。例如在俄語中,它將是「2-ойдень」,但是「2-аянеделя」(這些意思是「第2天」,而是「第2周」)。如果我們僅格式化日期,這不適用,但在更通用的情況下,您應該瞭解複雜性。
我認爲很好的解決方案(我沒有時間去實際實現)將擴展SimpleDateFormetter在傳遞到父類之前應用本地感知的MessageFormat。通過這種方式,你可以支持3月格式%M獲得「3-rd」,%MM獲得「03-rd」和%MMM獲得「第三個」。從這個類看起來像普通的SimpleDateFormatter,但支持更多的格式。另外,如果這種模式被常規的SimpleDateFormetter錯誤地應用,結果將被錯誤地格式化,但仍然可讀。
關於俄羅斯性別的好處,但是如果沒有額外的上下文,這在技術上會使%MMM無法實現。 – 2018-01-25 01:22:37
這裏的許多例子將不適用於11,12,13。這是更通用的,將適用於所有情況。
switch (date) {
case 1:
case 21:
case 31:
return "" + date + "st";
case 2:
case 22:
return "" + date + "nd";
case 3:
case 23:
return "" + date + "rd";
default:
return "" + date + "th";
}
以下方法可用於獲取傳入其中的日期的格式化字符串。它將格式化日期以說明第1,第2,第3,第4 ...在Java中使用SimpleDateFormat。例如: - 2015年9月1日
public String getFormattedDate(Date date){
Calendar cal=Calendar.getInstance();
cal.setTime(date);
//2nd of march 2015
int day=cal.get(Calendar.DATE);
switch (day % 10) {
case 1:
return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
case 2:
return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
case 3:
return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
default:
return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
}
11日,12日,13日 – Sarz 2015-11-05 09:13:40
問題不大。由於這個問題非常嘈雜,所以發佈了我用靜態方法解決的問題。只需複製,粘貼並使用它!
public static String getFormattedDate(Date date){
Calendar cal=Calendar.getInstance();
cal.setTime(date);
//2nd of march 2015
int day=cal.get(Calendar.DATE);
if(!((day>10) && (day<19)))
switch (day % 10) {
case 1:
return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
case 2:
return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
case 3:
return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
default:
return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
}
return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
}
爲了測試purose
示例:從主要方法調用它!
Date date = new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
for(int i=0;i<32;i++){
System.out.println(getFormattedDate(cal.getTime()));
cal.set(Calendar.DATE,(cal.getTime().getDate()+1));
}
輸出:
22nd of February 2018
23rd of February 2018
24th of February 2018
25th of February 2018
26th of February 2018
27th of February 2018
28th of February 2018
1st of March 2018
2nd of March 2018
3rd of March 2018
4th of March 2018
5th of March 2018
6th of March 2018
7th of March 2018
8th of March 2018
9th of March 2018
10th of March 2018
11th of March 2018
12th of March 2018
13th of March 2018
14th of March 2018
15th of March 2018
16th of March 2018
17th of March 2018
18th of March 2018
19th of March 2018
20th of March 2018
21st of March 2018
22nd of March 2018
23rd of March 2018
24th of March 2018
25th of March 2018
我不能答覆呼籲基於手動格式英語,唯一的解決方案來滿足。我一直在尋找一個適當的解決方案,現在我終於找到了。您應該使用RuleBasedNumberFormat。它完美的工作,並尊重Locale。
在科特林你可以使用這樣
fun changeDateFormats(currentFormat: String, dateString: String): String {
var result = ""
try {
val formatterOld = SimpleDateFormat(currentFormat, Locale.getDefault())
formatterOld.timeZone = TimeZone.getTimeZone("UTC")
var date: Date? = null
date = formatterOld.parse(dateString)
val dayFormate = SimpleDateFormat("d", Locale.getDefault())
var day = dayFormate.format(date)
val formatterNew = SimpleDateFormat("hh:mm a, d'" + getDayOfMonthSuffix(day.toInt()) + "' MMM yy", Locale.getDefault())
if (date != null) {
result = formatterNew.format(date)
}
} catch (e: ParseException) {
e.printStackTrace()
return dateString
}
return result
}
private fun getDayOfMonthSuffix(n: Int): String {
if (n in 11..13) {
return "th"
}
when (n % 10) {
1 -> return "st"
2 -> return "nd"
3 -> return "rd"
else -> return "th"
}
}
一套這樣
txt_chat_time_me.text = changeDateFormats("SERVER_DATE", "DATE")
作爲參考,這些被稱爲序數 - http://en.wikipedia.org/wiki/Ordinal_number_(linguistics )。 – ocodo 2010-10-25 01:23:08
只是爲了記錄,任何構建響應而不是在表中查找_whole_答案的東西幾乎不可能本地化爲其他語言。 – 2010-10-25 02:58:13
答案有點不正確,請看我的回答plz。 – J888 2013-07-31 03:15:13