Untitled
unknown
java
3 years ago
11 kB
2
Indexable
Never
import java.util.Arrays; import java.util.Scanner; import java.util.Date; import java.text.SimpleDateFormat; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; public class Main { /*** Get user's input (select feature) and calls the corresponding function * @param args, preset param * @throws * @return * Example: If user inputs 'B', * then user will be asked to input a year, and transform(year) will be called. * Time estimate: O(n) */ public static void main(String[] args) { while(true) { System.out.print("輸入指令號碼或 E(結束使用)\n"); System.out.print("輸入指令:\n"); System.out.print("1) A 顯示該月月曆\n"); System.out.print("2) B 西元轉換干支、生肖\n"); System.out.print("3) C 計算天數\n"); System.out.print("4) D 計算日期\n"); System.out.print("5) E 離開\n\n"); Scanner scanner = new Scanner(System.in); String select = scanner.next(); switch(select) { case "A": System.out.println("請輸入欲查詢日期(年/月/日):"); // Scanner scannerA = new Scanner(System.in); String dateA = scanner.next(); showMonth(dateA); break; case "B": System.out.print("請輸入欲查詢年:\n"); String year = scanner.next(); transform(year); break; case "C": // Scanner scannerC = new Scanner(System.in); System.out.print("請輸入欲查詢日期(年/月/日):\n"); String date = scanner.next(); calDays(date); // scannerC.close(); break; case "D": System.out.println("請輸入往後推算得天數:"); Scanner scannerD = new Scanner(System.in); int count = scanner.nextInt(); calDate(count); scannerD.close(); break; case "E": System.out.println("---EXIT---"); scanner.close(); System.exit(0); break; default: System.out.println("請重新輸入"); break; } } } /*** Show monthly calendar * @param string, input date * @throws ParseException * If the date is not in "yyyy/MM/dd" format, or * missing either year, month or day in the string, * ParseException will be thrown. * @return * Example: showMonth("2022/03/24"), shows the monthly calendar of 2022/03. * Time estimate: O(7*root(7)) */ private static void showMonth(String string) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); try { Date date = sdf.parse(string); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); // int month = calendar.get(Calendar.MONTH); // int year = calendar.get(Calendar.YEAR); calendar.set(Calendar.DAY_OF_MONTH, 1); int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // // System.out.println(month); // System.out.println(year); // System.out.println(firstDayOfWeek); // System.out.println(daysInMonth); System.out.println("Sun Mon Tus Wen Thu Fri Sat"); //print space until the first day of month for (int i = 0; i < firstDayOfWeek - 1; i++) { System.out.print(" "); } for (int i = 1, day = firstDayOfWeek; i<=daysInMonth; i++, day++){ System.out.printf("%3d ", i); day = day%7; if(day == 0) System.out.print('\n'); } System.out.println(); return ; } catch (ParseException e) { System.out.println("Wrong input format!\n"); return; } } /*** Parse the corresponding heaven sign from string * @param string, input year * @throws * @return * Example: Zodiac("2022"), heaven = "壬". * Time estimate: O(1) */ private static String Heaven(String string) { String heaven = ""; int number = Integer.parseInt(string) % 10; switch(number){ case 0: heaven = "庚"; break; case 1: heaven = "辛"; break; case 2: heaven = "壬"; break; case 3: heaven = "癸"; break; case 4: heaven = "甲"; break; case 5: heaven = "乙"; break; case 6: heaven = "丙"; break; case 7: heaven = "丁"; break; case 8: heaven = "戊"; break; case 9: heaven = "己"; break; default: System.out.println("Wrong input format!\n"); } return heaven; } /*** Parse the corresponding earth sign from string * @param string, input year * @throws * @return * Example: Zodiac("2022"), earth = "寅". * Time estimate: O(1) */ private static String Earth(String string) { String earth = ""; int number = Integer.parseInt(string) % 12; switch(number){ case 0: earth = "申"; break; case 1: earth = "酉"; break; case 2: earth = "戌"; break; case 3: earth = "亥"; break; case 4: earth = "子"; break; case 5: earth = "丑"; break; case 6: earth = "寅"; break; case 7: earth = "卯"; break; case 8: earth = "辰"; break; case 9: earth = "巳"; break; case 10: earth = "午"; break; case 11: earth = "未"; break; default: System.out.println("Wrong input format!\n"); } return earth; } /*** Parse the corresponding zodiac sign from string * @param string, input year * @throws * @return * Example: Zodiac("2022"), zodiac = "虎". * Time estimate: O(1) */ private static String Zodiac(String string) { String zodiac = ""; int number = Integer.parseInt(string) % 12; switch(number){ case 0: zodiac = "猴"; break; case 1: zodiac = "雞"; break; case 2: zodiac = "狗"; break; case 3: zodiac = "豬"; break; case 4: zodiac = "鼠"; break; case 5: zodiac = "牛"; break; case 6: zodiac = "虎"; break; case 7: zodiac = "兔"; break; case 8: zodiac = "龍"; break; case 9: zodiac = "蛇"; break; case 10: zodiac = "馬"; break; case 11: zodiac = "羊"; break; default: System.out.println("Wrong input format!\n"); } return zodiac; } /*** Check whether the input year for transform() is valid * @param stringToCheck, input year * @param radix, range for Character.digit() * @throws * @return true if input year is valid. Otherwise, false. * Example: isStringInteger("-1", 10), return false. * Time estimate: O(n) */ public static boolean isStringInteger(String stringToCheck, int radix) { if(stringToCheck.isEmpty()) return false; //Check if the string is empty for(int i = 0; i < stringToCheck.length(); i++) { if(Character.digit(stringToCheck.charAt(i),radix) < 0) return false; } return true; } /*** Convert western years to sexagenary circle and zodiac * @param string, input year * @throws ParseException * If the date is not in "yyyy/MM/dd" format, or * missing either year, month or day in the string, * ParseException will be thrown. * @return * Example: transform("2022"), shows "2022年是壬寅年,屬虎". * Time estimate: O(n) */ private static void transform(String string) { if(!isStringInteger(string, 10)){ System.out.println("Wrong input format!"); } else{ String heaven = Heaven(string); String earth = Earth(string); String zodiac = Zodiac(string); System.out.println(string+"是"+heaven+earth+"年,屬"+zodiac); } return ; } /*** Calculate days * @param string, input date * @throws ParseException * If the date is not in "yyyy/MM/dd" format, or * missing either year, month or day in the string, * ParseException will be thrown. * @return * Example: calDays("2022/04/01"), shows "2022/04/01距離今天還有8天". * Time estimate: O(1) */ private static void calDays(String string) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); try { Date date = sdf.parse(string); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar calendar2 = Calendar.getInstance(); Date today = calendar2.getTime(); int days = (int) ((date.getTime()-today.getTime()) / (1000*3600*24)); days = days>=0?days+1:days; System.out.println(string + "距離今天還有" + days + "天\n"); return ; } catch (ParseException e) { System.out.println("Wrong input format!"); return ; } } /*** Calculate Date * @param count, input number of days after * @throws ParseException * If the date is not in "yyyy/MM/dd" format, or * missing either year, month or day in the string, * ParseException will be thrown. * @return * Example: calDate("10"), shows "往後10天是2022/04/03". * Time estimate: O(1) */ private static void calDate(int count) { if(count<0) { System.out.println("Wrong input format!\n"); return; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String ans = ""; Calendar calendar = Calendar.getInstance(); Date startDay = calendar.getTime(); Calendar cl = Calendar.getInstance(); cl.setTime(startDay); cl.add(Calendar.DATE, count); ans = sdf.format(cl.getTime()); System.out.println("往後" + count + "天是" + ans + "\n"); } }