Android-如何从onDateChangedListener检索“一年的一周”?

时间:2019-03-29 22:12:11

标签: android datepicker calendar

我有点咸菜。我正在构建一个应用程序,该应用程序从DatePicker显示日期,月份,年份和星期数。选择日期后,日期和星期数应显示在屏幕上。我设法显示了正确的日期,但是我很难显示星期数

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    datePicker = (DatePicker) findViewById(R.id.kalender);
    datoText = (TextView) findViewById(R.id.kalenderText);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    final int week = calendar.get(Calendar.WEEK_OF_YEAR);

    datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            String dato = dayOfMonth + " / " + (monthOfYear + 1) + " / " + year;
            datoText.setText(dato);
        }
    });

所以,我的问题是:如何显示所选日期的星期数?

1 个答案:

答案 0 :(得分:1)

即使您不想显示星期数,也应该使用格式化程序来格式化显示日期。这反过来也将很好地照顾星期数。我建议您在类中声明格式化程序的常量:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("d/M/u 'Uke' w", Locale.forLanguageTag("no"));

现在剩下的事情很简单了:

    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        LocalDate dato = LocalDate.of(year, monthOfYear + 1, dayOfMonth);
        datoText.setText(dato.format(DATE_FORMATTER));
    }

这将显示类似2/4/2019 Uke 14的字符串。您可以根据需要的输出量身定制格式模式字符串。不应解释为格式模式字母的字母放在单引号(撇号)内,例如'Uke'

我正在使用现代Java日期和时间API java.time。

问题:我可以在Android上使用java.time吗?

是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

如果您不能负担外部依赖项(即使在坚如磐石且面向未来的库中),则可以类似的方式使用老式的SimpleDateFormat,但前提是必须转换选定的值首先到Calendar,然后到Date。但是请注意,SimpleDateFormat类非常麻烦并且也不是线程安全的。

链接