在我的应用程序中,我有2个箭头显示2017年的月份和一些与之相关的数据。当用户点击“>”时它应该显示文本2月等。并且“<”显示当前所选月份的上个月如下:
< 1月>
这是我使用的代码:
按钮下一步:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, 1);
Date nextMonth = calendar.getTime();
int yearI = calendar.get(Calendar.YEAR);
if (yearI == 2018)
calendar.set(Calendar.YEAR,2017);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM");
String month = simpleDateFormat.format(nextMonth).toUpperCase();
monthName.setText(month);
Log.d("next month", "" + nextMonth);
按钮下一步:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, -1);
Date prevMonth = calendar.getTime();
int yearI = calendar.get(Calendar.YEAR);
if (yearI == 2016)
calendar.set(Calendar.YEAR,2017);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM");
String month = simpleDateFormat.format(prevMonth).toUpperCase();
monthName.setText(month);
Log.d("prev month", "" + prevMonth);
它工作正常,但问题是当我从当月1月开始并持续点击下一个直到我通过12月它将到明年1月2018年所以2017年1月的数据没有显示它只显示在第一次和当我点击上个月时它会从2017年1月到2016年12月而不是2017年12月回归。
我怎样才能让它只显示2017年的几个月?
答案 0 :(得分:0)
njzk的评论指出了你逻辑中的小问题。
此外,您正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是java.time类。大部分java.time都被反向移植到Android和Java 6以及Java 7(见下文)。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
int yearNumber = today.getYear();
int monthNumber = today.getMonthValue();
Year
您可以使用类型安全的Year
对象而不仅仅是整数来维护日历的状态。请致电toString
或getValue
向用户显示该值。
Year year = Year.from( today );
YearMonth
使用YearMonth
类维护日历的状态可能更有意义。
YearMonth ym = YearMonth.from( today );
您可以通过Month
枚举请求本月的本地化名称。要进行本地化,请指定:
检索Month
对象,并要求它生成本地化的String
对象。
Month month = today.getMonth(); // Returns an object from enum rather than a mere number.
String output = month.getDisplayName(
TextStyle.NARROW ,
Locale.CANADA_FRENCH
);
课程可以为你做数学,下个月或上个月。您可以拨打plus…
或minus…
方法。
LocalDate sameDateNextMonth = today.plusMonths( 1 );
或者您可以使用TemporalAdjuster
界面来操纵值。在TemporalAdjusters
(复数名称)类中查找实现。请注意,java.time使用immutable objects。不是改变(变异)对象的状态,而是使用基于原始值的值生成新对象。
LocalDate firstOfNextMonth = today.with( TemporalAdjusters.firstDayOfNextMonth() );
请注意,此代码比问题中看到的遗留代码更简单,更易读。
public class CalendarWidget {
Locale locale = Locale.getDefault() ; // Or ask the user, such as Locale.CANADA_FRENCH.
ZoneId zoneId = ZoneId.systemDefault() ; // Or ask the user for desired/expected zone such as `America/Montreal`.
YearMonth displayedYearMonth = YearMonth.from( LocalDate.now( zoneId ) ); // By default, initialize to ‘today’ in a particular time zone.
…
void moveToNextMonth() {
// Increment the year-month.
this.displayedYearMonth = this.displayedYearMonth.plusMonths( 1 );
this.updateUserInterface();
}
void moveToPreviousMonth() {
// Decrement the year-month.
this.displayedYearMonth = this.displayedYearMonth.minusMonths( 1 );
this.updateUserInterface();
}
void updateUserInterface() {
// Update UI.
String textForYearLabel = Integer.toString( this.displayedYearMonth.getYear() ) ;
String textForMonthLabel = this.displayedYearMonth.getMonth().getDisplayName(
TextStyle.SHORT ,
this.locale
) ;
…
}
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?