(Android 笔记) Java 输出一页日历(以周一为一周的开始) 以及实现思路概况 作者: Chuwen 时间: 2020-11-01 分类: Android 评论 # 实现思路概述 > 由于我学 `Java` 是**半路出家,所以一些东西讲的并不标准**,请见谅,很愿意接受大家的批评建议 1. 用一个集合(`List`) 储存本页日历的日期信息(年、月、日、是否为本月<用以着色>) 2. 实例化日历类 `Calendar` ``` Calendar calendar = Calendar.getInstance(); ``` 3. 设置要显示哪年哪月的日历信息 ``` calendar.set(Calendar.YEAR, 2020);//设置哪年 calendar.set(Calendar.MONTH, 11);//设置哪个月 ``` 4. 将日历信息设置为本月1号 ``` calendar.set(Calendar.DAY_OF_MONTH, 1);//将日期推到本月1号 ``` 5. 获取本月1号是星期几,**由于我们需要设置从 周一 为一周的开始**,所以就有以下代码 > 如果是星期一,变量 `currentDayOfWeek` 应该输出 1; > ... > 如果是星期日,变量 `currentDayOfWeek` 应该输出 7. ``` int currentDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); currentDayOfWeek = currentDayOfWeek == 1 ? 7 : currentDayOfWeek - 1;//获取当前星期几(星期一就是1 ... 星期天是 7) ``` 6. 按照习惯,除了显示本月日历,一般还会显示上个月或下个月来填充 **剩余的格子**,所以我们在绘制前,将日期再往前推(减去) **当前星期几+1 的天数** > ![按照习惯,除了显示本月日历,一般还会显示上个月或下个月来填充 **剩余的格子**,所以我们在绘制前,将日期再往前推(减去) 当前星期几+1 的天数][1] ``` calendar.add(Calendar.DATE, -currentDayOfWeek + 1);//将日期倒退 当前星期几+1 的天数 ``` 7. 然后 **for 循环**,基础的日历格子有 **35** 个 ``` for (int i = 0; i < 35; i++) { Log.i("日期", calendar.get(Calendar.YEAR)+"年" +calendar.get(Calendar.MONTH) + 1+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日"; calendar.add(Calendar.DATE, +1);//日期+1 获取明天的 } ``` 8. **但是有特殊情况**,当该月1号是 **星期日**,那么我们还应该再增加 `7个格子`,不然日历显示不完整。所以我们需要额外判断下 ``` //绘制的格子数,如果恰好本月1号是星期天,那么就还要再加7个格子以显示完整日历 int gridNum = (currentDayOfWeek < 7) ? 35 : 42; for (int i = 0; i < gridNum; i++) { Log.i("日期", calendar.get(Calendar.YEAR)+"年" +calendar.get(Calendar.MONTH) + 1+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日"; calendar.add(Calendar.DATE, +1);//日期+1 获取明天的 } ``` 9. 大概日历的思路就是这样,要用其它语言实现也并不难 # `CalendarBean.java` ```java public class CalendarBean { private int year; private int month; private int day; private boolean currentMonth; private boolean isChecked = false; public CalendarBean() { } public CalendarBean(int year, int month, int day, boolean currentMonth) { this.year = year; this.month = month; this.day = day; this.currentMonth = currentMonth; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public boolean isCurrentMonth() { return currentMonth; } public void setCurrentMonth(boolean currentMonth) { this.currentMonth = currentMonth; } @NonNull @Override public String toString() { return getYear() + "年" + getMonth() + "月" + getDay() + "日"; } public boolean isChecked() { return isChecked; } public void setChecked(boolean checked) { isChecked = checked; } } ``` # CalendarCreate.java ```java public class CalendarCreate{ private Calendar calendar; private List calendarBeanList = new ArrayList<>(); public static void main(String[] args){ printCalendar(2020, 11);//输出2020年11月日历 } public void printCalendar(int year, int month) { month -= 1;//减去1,因为 java 日历,月份从 0 开始 int currentDayOfWeek; calendarBeanList.clear(); calendar.set(Calendar.YEAR, year);//设置哪年 calendar.set(Calendar.MONTH, month);//设置哪个月 calendar.set(Calendar.DAY_OF_MONTH, 1);//将日期推到本月1号 currentDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); currentDayOfWeek = currentDayOfWeek == 1 ? 7 : currentDayOfWeek - 1;//获取当前星期几(星期一就是1 ... 星期天是 7) calendar.add(Calendar.DATE, -currentDayOfWeek + 1);//将日期倒退 当前星期几+1 的天数 int gridNum = (currentDayOfWeek < 7) ? 35 : 42;//绘制的格子数,如果恰好本月1号是星期天,那么就还要再加57个格子以显示完整日历 for (int i = 0; i < gridNum; i++) { calendarBeanList.add(i, new CalendarBean( calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1,//一年中的哪个月。月份 calendar.get(Calendar.DAY_OF_MONTH),//一个月中的第几天。几号 calendar.get(Calendar.MONTH) == month//判断是否为本月 )); calendar.add(Calendar.DATE, +1);//日期+1 获取明天的 } Log.i("打印日历数组", calendarBeanList.toString()); } } ``` # 运行结果 ``` I/打印日历数组: [2020年10月26日, 2020年10月27日, 2020年10月28日, 2020年10月29日, 2020年10月30日, 2020年10月31日, 2020年11月1日, 2020年11月2日, 2020年11月3日, 2020年11月4日, 2020年11月5日, 2020年11月6日, 2020年11月7日, 2020年11月8日, 2020年11月9日, 2020年11月10日, 2020年11月11日, 2020年11月12日, 2020年11月13日, 2020年11月14日, 2020年11月15日, 2020年11月16日, 2020年11月17日, 2020年11月18日, 2020年11月19日, 2020年11月20日, 2020年11月21日, 2020年11月22日, 2020年11月23日, 2020年11月24日, 2020年11月25日, 2020年11月26日, 2020年11月27日, 2020年11月28日, 2020年11月29日, 2020年11月30日, 2020年12月1日, 2020年12月2日, 2020年12月3日, 2020年12月4日, 2020年12月5日, 2020年12月6日] ``` # 实际应用效果 > 橘黄色方框是实际应用效果 > 如果想要看完整的项目代码,可以查看 **糖疯子** 的代码 https://www.jianshu.com/p/4ae8f56f3bcb ![1604206482003.png][2] [1]: https://cdn.nowtime.cc/2020/11/01/2694057533.jpg [2]: https://cdn.nowtime.cc/2020/11/01/2390028636.png
Java List 与 JSON 相互转换 作者: Chuwen 时间: 2020-10-26 分类: Android,Java 评论 # 使用谷歌 `Gson`: ``` //list转换为json Gson gson = new Gson(); List persons = new ArrayList(); String str = gson.toJson(persons); ``` ``` //json转换为list Gson gson = new Gson(); List persons = gson.fromJson(str, new TypeToken>(){}.getType()); ```
Java 时间(格式化的时间格式) 转 星期几 作者: Chuwen 时间: 2020-10-19 分类: Java 评论 > 学习过程中的笔记,可能有不严谨的地方 # Java 时间(格式化的时间格式) 转 星期几 ``` import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Locale; public class Test { public static void main(String[] args) throws ParseException { System.out.println(strToWeek("2020-10-19 15:11:20", null)); } /** * 格式化的时间字符串 转 星期几 * @param date 例如 2020-10-19 15:46:32 * @param format 与 date 参数对应的格式,yyyy-MM-dd HH:mm:ss * @return */ public static String strToWeek(String date, String format) { if (format == null || format.isEmpty()) { format = "yyyy-MM-dd HH:mm:ss"; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("E", Locale.CHINA); try { return simpleDateFormat.format( (new SimpleDateFormat(format)).parse(date) ); } catch (ParseException e) { return "error"; } } } ```
关于 List 删除元素的笔记 作者: Chuwen 时间: 2020-10-15 分类: Java 评论 # 有以下代码 > 个人理解,可能有错 `MiBean.java` ``` public class MiBean { private int id; private String name; public MiBean(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` ``` List miBeanLists = new ArrayList<>(); miBeanLists.add(new MiBean(9, "小米 10")); miBeanLists.add(new MiBean(8, "小米 10 Pro")); miBeanLists.add(new MiBean(7, "小米 10 Ultra")); miBeanLists.add(new MiBean(12, "Redmi K30 Pro")); miBeanLists.add(new MiBean(11, "Redmi K30 5G")); miBeanLists.add(new MiBean(10, "Redmi K30 4G")); //我以为可以直接遍历,然后调用 remove 方法移除 for(int i=0; i 究其原因,原来是当删除之后 `i 因为我们之前删除了一个,所以在删除之后加一句 i--; 就可以全部删除了 --- > 复制别人总结的 >> 在代码中,删除元素后,需要把下标减一。这是因为在每次删除元素后,ArrayList会将后面部分的元素依次往上挪一个位置(就是copy),所以,下一个需要访问的下标还是当前下标,所以必须得减一才能把所有元素都遍历完
Java 使用 Collections.sort() 排序 作者: Chuwen 时间: 2020-10-12 分类: 其他分类 评论 > 只是记录下笔记 # RechargeHistoryList.class ``` public class RechargeHistoryList { private int id; private int carId; private int rechargeVal;//充值金额 private String rechargeDate; public RechargeHistoryList(int carId, int rechargeVal, String rechargeDate) { this.carId = carId; this.rechargeVal = rechargeVal; this.rechargeDate = rechargeDate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCarId() { return carId; } public void setCarId(int carId) { this.carId = carId; } public int getRechargeVal() { return rechargeVal; } public void setRechargeVal(int rechargeVal) { this.rechargeVal = rechargeVal; } public String getRechargeDate() { return rechargeDate; } public void setRechargeDate(String rechargeDate) { this.rechargeDate = rechargeDate; } } ``` # 代码 ``` ArrayList rechargeHistoryLists = new ArrayList<>(); rechargeHistoryLists.add(new GechargeHistoryLists(1, 100, "2020-10-12 09:35:20")) rechargeHistoryLists.add(new GechargeHistoryLists(2, 50, "2020-10-12 09:35:20")) Collections.sort(rechargeHistoryLists, new Comparator() { @Override public int compare(RechargeHistoryList o1, RechargeHistoryList o2) { return -(o1.getRechargeVal() - o2.getRechargeVal());//根据充值金额 “降序” 排序 //return o1.getRechargeVal() - o2.getRechargeVal();//根据充值金额 “升序” 排序 } }); ```