如何从“月份-年份”格式的字符串中获取上一个月与下一个月
实现方案
你可以直接在Activity/Fragment中维护一个全局的Calendar实例跟踪当前显示的月份,避免每次点击都解析文本内容,性能和稳定性更高,完整实现代码如下:
- 先在类内部声明全局变量
// 跟踪当前显示的日期 private Calendar currentCalendar; // 统一使用同一个日期格式化实例,指定Locale避免多语言环境异常 private SimpleDateFormat monthFormat = new SimpleDateFormat("MMM-yyyy", Locale.getDefault());
- 初始化逻辑
// 首次进入默认显示当前月份 currentCalendar = Calendar.getInstance(); textView.setText(monthFormat.format(currentCalendar.getTime())); // 下个月按钮点击事件 nextBtn.setOnClickListener(view -> { currentCalendar.add(Calendar.MONTH, 1); textView.setText(monthFormat.format(currentCalendar.getTime())); }); // 上个月按钮点击事件 prevBtn.setOnClickListener(view -> { currentCalendar.add(Calendar.MONTH, -1); textView.setText(monthFormat.format(currentCalendar.getTime())); });
注意事项
- 格式化符号需要把你原来写的
YYYY改为yyyy:YYYY是ISO周年纪年规则,年末年初的日期会显示错误年份,yyyy才是常规使用的公历年。 - Calendar会自动处理跨年、月末跳转的边界情况,比如12月点下个月会自动跳转到下一年1月,1月点上个月会自动跳转到上一年12月,不需要你额外做边界判断。
如果你确实需要从TextView当前显示的文本解析日期再做修改,可以使用下面的实现:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { String dateString = textView.getText().toString(); SimpleDateFormat sdf = new SimpleDateFormat("MMM-yyyy", Locale.getDefault()); Date date = sdf.parse(dateString); Calendar cal = Calendar.getInstance(); cal.setTime(date); // 加1为下个月,减1为上个月 cal.add(Calendar.MONTH, 1); textView.setText(sdf.format(cal.getTime())); } catch (ParseException e) { e.printStackTrace(); } } });
内容的提问来源于stack exchange,提问作者user16576274
相关产品推荐
相关产品推荐

