我正在尝试使用假期和日期(均为字符串)创建一个ArrayList,然后将日期转换为日历,获取星期几(使用DAY_OF_WEEK)和/或按日期/名称排序,但是由于某种原因,我得到了相同的结果(日历)列表中的每个项目。

这是我的代码:

公共静态ArrayList listOfHolidays = new ArrayList();

Holidays.holidaysList.add(new Holidays(“ Sukkot”,“ 09/10/2014”));
Holidays.holidaysList.add(new Holidays(“ Hanukkah”,“ 17/12/2014”));
Holidays.holidaysList.add(new Holidays(“ Purim”,“ 16/03/2014”));


假期班:


日历calendar = Calendar.getInstance();

@Override
公共字符串toString(){
// DayOfWeek只是天的枚举(字符串)
返回holidayName +“落在”
+ DayOfWeek.values()[Calendar.DAY_OF_WEEK-1]; //在这里我每次都得到同一天
}

@Override
public int compareTo(假日另一个){
if(MainActivity.sortByName == true){
返回holidayName.compareToIgnoreCase(another.holidayName);
}
return convertStringToCal()-another.convertStringToCal();
}

私人int convertStringToCal(){
int年,月,日;
天= Integer.valueOf(holidayDate.substring(0,2));
month = Integer.valueOf(holidayDate.substring(3,5));
年= Integer.valueOf(holidayDate.substring(6,10));
calendar = Calendar.getInstance();
calendar.set(年,月,日);
返回(int)calendar.getTimeInMillis();
}



我从radioButton方法中调用Collections.sort()进行排序。

最佳答案

我看到它可能无法正常工作的多种原因。

首先,我不知道您是否省略了Holidays类的部分代码,但是您实际上从未设置convertStringToCal()方法之外的日历对象,但我不知道此方法是否在构造函数中也被调用。

其次,最有可能是您的问题:

@Override
    public String toString() {
    //DayOfWeek is just an enum of days (strings)
        return holidayName + " falls on "
                                        // Here you are using the constant Calendar.DAY_OF_WEEK
                    + DayOfWeek.values()[Calendar.DAY_OF_WEEK - 1]; // Here i get the same day each time
    }


它实际上应该看起来像这样:

@Override
    public String toString() {
    //DayOfWeek is just an enum of days (strings)
        return holidayName + " falls on "
                    + DayOfWeek.values()[calendar.get(Calendar.DAY_OF_WEEK)]; // Now you won't get the same day every time. :)
    }


一些附加说明:

我将使用Date对象保存日期,并使用SimpleDateFormat将字符串转换为日期以及其他方式。

如果使用这两个,则Holidays类将如下所示:

public class Holidays {

        private final Calendar calendar = Calendar.getInstance();
        private final String holidayName;

        public Holidays(String holidayName, Date date) {
            this.holidayName = holidayName;
            this.calendar.setTime(date);
        }

        @Override
        public int compareTo(Holidays another) {
            // Generally you should avoid passing information statically between Activities
            if(MainActivity.sortByName == true) {
                    return holidayName.compareToIgnoreCase(another.holidayName);
            }
            return getTimeInMillis() - another.getTimeInMillis();
        }

        public long getTimeInMillis() {
            return this.calendar.getTimeInMillis();
        }

        @Override
        public String toString() {
        //DayOfWeek is just an enum of days (strings)
            DayOfWeek day = DayOfWeek.values()[calendar.get(Calendar.DAY_OF_WEEK)]; // Now you won't get the same day every time. :)
            return String.format("%s falls of %s", this.holidayName, day);
        }

    }


您可以这样创建Date对象:

// Create date objects with calendar.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2014);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.DAY_OF_MONTH, 27);
Date date = calendar.getTime();


Date对象的构造方法(如新的Date(年,月,日))已被弃用,不应使用。始终使用Calendar实例创建日期对象。

使用SimpleDateFormat可以转换StringDate对象,如下所示:

// The String pattern defines how date strings are parsed and formated
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

String dateString = "09/10/2014";

// Convert a String to Date
Date dateFromDateString = sdf.parse(dateString);

// Convert a Date to a String
String dateStringFromDate = sdf.format(dateFromDateString);


如果您不仅需要简单地转换DateString对象,还可以使用DateFormat。这几乎就是劳斯莱斯日期字符串转换。它可以以更通用的方式解析和格式化字符串,而无需实际使用模式,并且它可以自动解决语言环境等问题。

或者您可以只使用JodaTime :)

07-24 20:00