Android:比较当前和明年

时间:2017-01-29 16:29:25

标签: java android date calendar

在我的应用程序中,我有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年的几个月?

1 个答案:

答案 0 :(得分:0)

njzk的评论指出了你逻辑中的小问题。

使用java.time

此外,您正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是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对象而不仅仅是整数来维护日历的状态。请致电toStringgetValue向用户显示该值。

Year year = Year.from( today );

YearMonth

使用YearMonth类维护日历的状态可能更有意义。

YearMonth ym = YearMonth.from( today );

本地化

您可以通过Month枚举请求本月的本地化名称。要进行本地化,请指定:

  • TextStyle确定字符串的长度或缩写。
  • Locale确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大写,标点符号,分隔符等问题的文化规范

检索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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?