如何使用 LocalDate 设置月份和年份?

fat*_*164 4 java android-calendar java-time localdate

在此输入图像描述

\n

我想用这两个数字选择器更改月份和年份,但我不知道如何更改日期。我想要做的是:当我单击 BottomSheetDialog 上的“确定”按钮时,我想设置月份和年份。你能帮我吗?我尝试过,但在互联网上找不到任何解决方案。如果您帮助我,我将不胜感激。谢谢。

\n
public class PlannerFragment extends Fragment implements CalendarAdapter.OnItemListener{\n\nprivate TextView monthYearTextView;\nprivate TextView monthYearPickerOKTextView;\nprivate ImageView nextMonthImageView, previousMonthImageView;\nprivate RecyclerView calendarRecyclerView;\nprivate LocalDate selectedDate; /// tekrar buna bak\xc4\xb1lacak\nprivate NumberPicker monthNumberPicker, yearNumberPicker;\n\n@Override\npublic View onCreateView(LayoutInflater inflater, ViewGroup container,\n                         Bundle savedInstanceState) {\n    getActivity().setTitle("Planner");\n    View v = inflater.inflate(R.layout.fragment_planner, container, false);\n\n    previousMonthImageView = v.findViewById(R.id.previous_month_image_view);\n    nextMonthImageView = v.findViewById(R.id.next_month_image_view);\n\n    calendarRecyclerView = v.findViewById(R.id.calendar_recycler_view);\n    monthYearTextView = v.findViewById(R.id.month_year_text_view);\n\n    selectedDate = LocalDate.now();\n\n    setMonthYear();\n\n    previousMonthImageView.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n            selectedDate = selectedDate.minusMonths(1);\n            setMonthYear();\n        }\n    });\n\n    nextMonthImageView.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n            selectedDate = selectedDate.plusMonths(1);\n            setMonthYear();\n        }\n    });\n\n    monthYearTextView.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n            monthYearPicker(v);\n        }\n    });\n\n\n    return v;\n}\n\nprivate void setMonthYear() {\n    monthYearTextView.setText(monthYearFromDate(selectedDate));\n    ArrayList<String> daysInMonth = daysInMonthArray(selectedDate);\n\n    CalendarAdapter calendarAdapter = new CalendarAdapter(getActivity(), daysInMonth,\n            this);\n    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 7);\n    calendarRecyclerView.setLayoutManager(layoutManager);\n    calendarRecyclerView.setAdapter(calendarAdapter);\n}\n\nprivate ArrayList<String> daysInMonthArray(LocalDate date) {\n    ArrayList<String> daysInMonthList = new ArrayList<>();\n    YearMonth yearMonth = YearMonth.from(date);\n    int daysInMonth = yearMonth.lengthOfMonth();\n    LocalDate firstDayOfMonth = selectedDate.withDayOfMonth(1);\n    int dayOfWeek = firstDayOfMonth.getDayOfWeek().getValue();\n    if (dayOfWeek == 7){\n        dayOfWeek = 1;\n    } else {\n        dayOfWeek++;\n    }\n\n    for (int i = 1; i <= 42; i++) {\n        if (i < dayOfWeek || i >= daysInMonth + dayOfWeek){\n            daysInMonthList.add("");\n        } else {\n            daysInMonthList.add(String.valueOf(i - dayOfWeek + 1));\n        }\n    }\n\n    return daysInMonthList;\n}\n\nprivate String monthYearFromDate(LocalDate localDate) {\n    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");\n    return localDate.format(formatter);\n}\n\n@Override\npublic void onItemClick(int position, String dayText) {\n    LocalDate firstDayOfMonth = selectedDate.withDayOfMonth(1);\n    int dayOfWeek = firstDayOfMonth.getDayOfWeek().getValue();\n    if (dayOfWeek == 7){\n        dayOfWeek = 1;\n    } else {\n        dayOfWeek++;\n    }\n    if (!dayText.equals("")){\n        /*Toast.makeText(getActivity(), dayText + " " + monthYearFromDate(selectedDate),\n                Toast.LENGTH_SHORT).show();*/\n        Toast.makeText(getActivity(), String.valueOf(dayOfWeek),\n                Toast.LENGTH_SHORT).show();\n    }\n}\n\npublic void monthYearPicker(View v){\n    BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(),\n            R.style.BottomSheetDialogTheme);\n    View bottomSheetView = LayoutInflater.from(getActivity())\n            .inflate(R.layout.month_and_year_picker_bottom_sheet_layout,\n                    (ConstraintLayout) v.findViewById(R.id.month_year_picker_bottom_sheet_container));\n\n\n    monthNumberPicker = bottomSheetView.findViewById(R.id.month_number_picker);\n    yearNumberPicker = bottomSheetView.findViewById(R.id.year_number_picker);\n    final Calendar calendar = Calendar.getInstance();\n\n    Month.initMonths();\n    monthNumberPicker.setMinValue(0);\n    monthNumberPicker.setMaxValue(Month.getMonthArrayList().size() - 1);\n    monthNumberPicker.setDisplayedValues(Month.monthNames());\n    monthNumberPicker.setValue(calendar.get(Calendar.MONTH));\n\n    yearNumberPicker.setMinValue(1984);\n    yearNumberPicker.setMaxValue(2040);\n    yearNumberPicker.setValue(calendar.get(Calendar.YEAR));\n\n    bottomSheetView.findViewById(R.id.month_year_picker_ok_text_view).setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n            bottomSheetDialog.dismiss();\n            selectedDate.withMonth(monthNumberPicker.getValue());\n            setMonthYear();\n            Toast.makeText(getActivity(), Month.getMonthArrayList().get(monthNumberPicker.getValue()).getName(),\n                    Toast.LENGTH_SHORT).show();\n        }\n    });\n\n\n    bottomSheetDialog.setContentView(bottomSheetView);\n    bottomSheetDialog.show();\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

}

\n

Jay*_*667 6

良好的实施,正确的更新答案:

    LocalDate date1 = LocalDate.of(2021, Month.JANUARY, 1);
    LocalDate date2 = date1.withYear(2010);
    LocalDate date3 = date2.withMonth(Month.DECEMBER.getValue());
    LocalDate date4 = date3.withDayOfMonth(15);
    LocalDate date5 = date4.with(ChronoField.DAY_OF_YEAR, 100);
Run Code Online (Sandbox Code Playgroud)

从https://kodejava.org/how-do-i-manipulate-the-value-of-localdate-object/窃取

过时的实施不好,答案不好(只是为了协议)

简单的纯Java实现:

  • 使用日历。创建一个新实例;您可能需要公历:Calendar.getInstance();
  • 将日历值设置为日期:cal.setTime(pDate);
  • 调整单个字段:cal.add(pField, pValue);cal.set(pField, pValue);
  • 检索日期对象:cal.getTime();

您还可以使用新的java.time包,以及诸如此类的类LocalDateTime

还有无数的 Java 日期时间库。

选择最适合您的方式。