我正在尝试使用假期和日期(均为字符串)创建一个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
可以转换String
和Date
对象,如下所示:// 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);
如果您不仅需要简单地转换
Date
和String
对象,还可以使用DateFormat
。这几乎就是劳斯莱斯日期字符串转换。它可以以更通用的方式解析和格式化字符串,而无需实际使用模式,并且它可以自动解决语言环境等问题。或者您可以只使用JodaTime :)