我有以下代碼以字符串yyyy-MM-dd HH:mm:ss
(UTC時區)的形式取日期並將其轉換爲EEEE d(st, nd, rd, th) MMMM yyyy HH:mm
(設備的默認時區)。解析和格式日期
但是,我所做的方式的問題是代碼看起來凌亂和低效。有沒有一種方法可以實現我想要的功能,而無需多次格式化和解析同一日期以提高效率?還是有其他改進?
最好的Android支持API級別14
String inputExample = "2017-06-28 22:44:55";
//Converts UTC to Device Default (Local)
private String convertUTC(String dateStr) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date temp = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String local = df.format(temp);
Date localDate = df.parse(dateStr);
SimpleDateFormat outputDF1 = new SimpleDateFormat("EEEE ");
SimpleDateFormat outputDF2 = new SimpleDateFormat(" MMMM yyyy HH:mm");
return outputDF1.format(temp) + prefix(local) + outputDF2.format(temp);
} catch(java.text.ParseException pE) {
Log.e("", "Parse Exception", pE);
return null;
}
}
private String prefix(String dateStr) {
try {
SimpleDateFormat outputDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date temp = outputDF.parse(dateStr);
SimpleDateFormat df = new SimpleDateFormat("d");
int d = Integer.parseInt(df.format(temp));
if(1 <= d && d <= 31) {
if(11 <= d && d <= 13)
return d + "th";
switch (d % 10) {
case 1: return d + "st";
case 2: return d + "nd";
case 3: return d + "rd";
default: return d + "th";
}
}
Log.e("", "Null Date");
return null;
} catch(java.text.ParseException pE) {
Log.e("", "Parse Exception", pE);
return null;
}
}
我投票結束這個問題作爲題外話,因爲它屬於[codereview.se]。 – shmosel
@shmosel謝謝你指出。我會在那裏發佈 – Dan
你必須剖析你的代碼,找出導致性能差的原因。至於「雜亂」的部分 - 好吧,java.util.date API被廣泛認爲是「雜亂」,沒有太多可以做的事情。重構代碼以找到更清潔的方法。在開始重構之前,確保你有一套防彈套裝的單元測試。 – Egor