根據當前時間顯示「早安」、「午安」、「晚安」等問候語,核心邏輯為取得當前小時/分鐘,與預設時間區間比對。注意時區處理與跨日邊界(如 23:00-05:00 為深夜)。
public class GreetingHelper {
public static String getGreeting() {
Calendar cal = Calendar.getInstance(); // 使用者裝置本地時間
int hour = cal.get(Calendar.HOUR_OF_DAY); // 0-23
int minute = cal.get(Calendar.MINUTE);
int timeInMinutes = hour * 60 + minute; // 0-1439
if (timeInMinutes >= 5*60+0 && timeInMinutes < 11*60+0) { // 05:00-10:59
return "早安";
} else if (timeInMinutes >= 11*60+0 && timeInMinutes < 14*60+0) { // 11:00-13:59
return "午安";
} else if (timeInMinutes >= 14*60+0 && timeInMinutes < 18*60+0) { // 14:00-17:59
return "下午好";
} else if (timeInMinutes >= 18*60+0 && timeInMinutes < 22*60+0) { // 18:00-21:59
return "晚安";
} else { // 22:00-04:59
return "夜深了,早點休息";
}
}
}
// 使用
TextView tv = findViewById(R.id.greetingText);
tv.setText(GreetingHelper.getGreeting());
@Data
class TimeGreeting {
int startHour, startMinute;
int endHour, endMinute;
String text;
}
// 配置列表(可從 JSON/資料庫載入)
List<TimeGreeting> greetings = Arrays.asList(
new TimeGreeting(5, 0, 11, 0, "早安"),
new TimeGreeting(11, 0, 14, 0, "午安"),
new TimeGreeting(14, 0, 18, 0, "下午好"),
new TimeGreeting(18, 0, 22, 0, "晚安"),
new TimeGreeting(22, 0, 5, 0, "夜深了") // 跨日
);
public String getGreetingDynamic() {
Calendar now = Calendar.getInstance();
int curr = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE);
for (TimeGreeting g : greetings) {
int start = g.startHour * 60 + g.startMinute;
int end = g.endHour * 60 + g.endMinute;
if (start < end) { // 同一天區間
if (curr >= start && curr < end) return g.text;
} else { // 跨日區間(如 22:00-05:00)
if (curr >= start || curr < end) return g.text;
}
}
return "你好"; // 預設
}
fun getGreeting(): String {
val hour = LocalTime.now().hour
return when (hour) {
in 5..10 -> "早安"
in 11..13 -> "午安"
in 14..17 -> "下午好"
in 18..21 -> "晚安"
else -> "夜深了,早點休息"
}
}
// 計算下一個時間邊界,設定定時器
Handler handler = new Handler(Looper.getMainLooper());
Runnable updater = new Runnable() {
@Override
public void run() {
tv.setText(getGreeting());
scheduleNextUpdate(); // 重新計算下一邊界延遲
}
};
void scheduleNextUpdate() {
// 簡易版:每分鐘檢查一次
handler.postDelayed(updater, 60_000);
}
// 生命週期管理
@Override
protected void onResume() { super.onResume(); scheduleNextUpdate(); }
@Override
protected void onPause() { super.onPause(); handler.removeCallbacks(updater); }
Calendar.getInstance() 回傳裝置本地時間,適合顯示給使用者。ZonedDateTime.now(ZoneId.of("Asia/Taipei")) 明確指定時區。strings.xml 並配合 getString() 取得。將時間邏輯封裝為可配置、可測試的工具類,即能輕鬆實現動態問候並支援未來擴充。