日历不会返回带有AMPM的日期

问题描述 投票:0回答:1

我想要AMPM格式的日期。例子建议使用简单的日期格式(SimpleDateFormat),并加上a或aa,但这对我来说根本行不通。

首先,我设置了日期。然后我将开始时间的视图设置为可见。

结果是格式为Wed 20 May 20 01:00:00 EDT 2020,想要像Wed 20 May 20 01:00:00 AM EDT 2020这样的格式。

这适用于setStartTime方法中的calendar.getTime()。第一个方法之所以被包含在内,是因为所选的日期是作为一个全局变量链接的。问题出在第二个方法上。

我也许可以手动将最终的日期改为字符串并转换回来,但我不想增加不必要的复杂性。我想找出为什么Calendar不会成功,因为这应该是非常基本的。

最后我的目标是将日期添加到firebase。它必须在Android、IOS和Web上统一。因此,我需要日期是以这种精确的格式。

下面是代码。

    SimpleDateFormat serviceSETimeFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm aa");

public void setStartDay(View view)
{
    Calendar calendar = Calendar.getInstance();
    DatePickerDialog picker = new DatePickerDialog(ServiceCreation.this,
        new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                GregorianCalendar mCal = new GregorianCalendar(year, monthOfYear, dayOfMonth);
                Date dateForDisplay = mCal.getTime();
                int startHourIndex = getThirdSpaceIndex(dateForDisplay.toString());
                //SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
                serviceSETimeFormat.setCalendar(mCal);
                Date dateFormatted = null;
                try{
                    dateFormatted= serviceSETimeFormat.parse(serviceSETimeFormat.format(mCal.getTime()));
                    currBaseStartDate=dateFormatted;
                }
                catch(ParseException p){
                    Log.wtf("SC","Parse exc34");
                }
                Log.wtf("SC","Here is orig date: "+dateFormatted);
                //Don't show hh/mm/ss (these are held as 0)
                startDayView.setText(dateForDisplay.toString().substring(0,startHourIndex));
                startEndTimeWrapper.setVisibility(View.VISIBLE);
            }
        }, calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
    long currentTime = new Date().getTime();
    picker.getDatePicker().setMinDate(currentTime);
    picker.show();
}


public void setStartTime(View view) {
    TimePickerDialog mTimePicker = new TimePickerDialog(ServiceCreation.this,
        android.R.style.Theme_Holo_Light_Dialog_NoActionBar, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
            String minuteAsS =  Integer.toString(selectedMinute);
            if(minuteAsS.length()==1){
                minuteAsS="0"+minuteAsS;
            }
            if(selectedHour==0){
                startTimeView.setText((selectedHour+12)+":"+minuteAsS+" AM");
            }
            else if(selectedHour<12){
                startTimeView.setText(selectedHour+":"+minuteAsS+" AM");
            }
            else if(selectedHour==12){
                startTimeView.setText((selectedHour)+":"+minuteAsS+" PM");
            }
            else{
                startTimeView.setText((selectedHour-12)+":"+minuteAsS+" PM");
            }

            (findViewById(R.id.endTimeWrapper)).setVisibility(View.VISIBLE);
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(currBaseStartDate);
            calendar.set(Calendar.MINUTE, selectedMinute);
            Log.wtf("SC","Hour before condition: "+selectedHour);
            if(selectedHour>=12){
                if(selectedHour!=12){
                    Log.wtf("SC","Decrementing hour");
                    selectedHour-=12;
                }
                Log.wtf("SC","Hour set: "+selectedHour);
                calendar.set(Calendar.AM_PM,Calendar.PM);
                calendar.set(Calendar.HOUR_OF_DAY,selectedHour);
            }
            else{
                calendar.set(Calendar.AM_PM,Calendar.AM);
                calendar.set(Calendar.HOUR_OF_DAY,selectedHour);
            }
            startTime=calendar.getTime();
            Log.wtf("SC","Here is orig start time: "+startTime);
            try{
                startTime=serviceSETimeFormat.parse(serviceSETimeFormat.format(startTime));
                Log.wtf("SC","Here is parsed start time: "+startTime);
            }
            catch(ParseException e){
                Log.wtf("SC","START DATE PARSE EXCEPTION");
            }
        }
    }, 12, 0, false);
    mTimePicker.setTitle("Select Start Time: ");
    mTimePicker.show();
}
android calendar simpledateformat
1个回答
0
投票

三点。

  1. 即使在安卓系统上 甚至在API级别低于26的情况下 考虑使用java.time,现代Java日期和时间API。Calendar, GregorianCalendar, SimpleDateFormatDate 是混乱的,糟糕的设计和长期过时的类。现代的API要好用得多。
  2. 你不想要一个 CalendarDate 与AM或PM。你要把你的模型和你对用户的展示分开。在模型中,您需要一个 LocalDateTime 或其他适当的日期-时间对象,你不想担心它的格式,不管它使用的是12小时还是24小时时钟。为了向用户显示日期和时间,你需要以一个 绳子 以适合您的用户的格式,包括AM或PM。这也是为什么您的观点有一个 setText 方法,而不 setDate 方法。
  3. Date 与AMPM格式可以存在。你在问不可能的事情。

java.time 和 ThreeTenABP

构建一个 LocalDate 年、月、日三个整数的对象。

    int year = 2020;
    int monthOfYear = Calendar.MAY; // Don’t use Calendar, though
    int dayOfMonth = 11;

    LocalDate date = LocalDate.of(year, monthOfYear + 1, dayOfMonth);
    System.out.println(date);

输出:

2020-05-11

我相信你的日期选择器的月份数是从0代表一月到11代表十二月。所以,我们需要在月号上加1,以转换为人类和 LocalDate 数月。我只使用了来自 Calendar 类来初始化变量为基于0的月份数,不要在你的代码中这样做,因为值来自数据选取器。Calendar 使用同样疯狂的编号。

要将日期显示回给用户使用格式化器将其格式化为一个字符串。

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.US);
    String dateForDisplay = date.format(dateFormatter);
    System.out.println(dateForDisplay);

2020年5月11日

给出适当的地点,或者不说呼叫到 withLocale() 以依赖设备的地域设置。

当用户选择时间时。

    int selectedHour = 1;
    int selectedMinute = 0;

    LocalTime selectedTime = LocalTime.of(selectedHour, selectedMinute);
    LocalDateTime dateTime = date.atTime(selectedTime);
    System.out.println(dateTime);

2020-05-11T01:00

时间的格式化可以和我们对日期的处理方式非常相似。

    DateTimeFormatter timeFormatter = DateTimeFormatter
            .ofLocalizedTime(FormatStyle.MEDIUM)
            .withLocale(Locale.US);
    String timeForDisplay = selectedTime.format(timeFormatter);
    System.out.println(timeForDisplay);

1: 00: 00 AM

问题:java.time不是需要Android API 26级吗?java.time不需要Android API level 26吗?

java.time在新旧Android设备上都能很好地工作。它只是要求至少有 Java 6.

  • 在Java 8及以后的版本和较新的Android设备上(从API level 26开始)内置了现代API。
  • 在非Android Java 6和7中得到ThreeTen Backport,即现代类的回传(ThreeTen for JSR 310;见底部的链接)。
  • 在(老的)Android上使用Android版的ThreeTen Backport。它叫做ThreeTenABP。并确保你从以下地方导入日期和时间类 org.threeten.bp 与子包。

鏈接

© www.soinside.com 2019 - 2024. All rights reserved.