我目前正在开发一些需要为Calendar类实例减去或增加时间的功能。我需要添加/订阅的时间在属性文件中,可以是以下任何一种格式:
30秒
90秒
1.5,分钟
2,天
2.333,天
为了简单起见,我们假设添加。我会在String数组中读取这些值:
String[] propertyValues = "30,sec".split(",");
我将读取该逗号分隔对中的第二个值,并将其映射到Calendar类中的相关int(例如,“ sec”成为Calendar.SECOND,“ min”成为Calendar.MINUTE):< / p>
int calendarMajorModifier = mapToCalendarClassIntValues(propertyValues[1]);
然后要做实际的操作,我会像这样简单:
cal.add(calendarMajorModifier, Integer.parseInt(propertyValues[0]));
这有效,并且也不过分复杂。现在的问题是浮动值(对于eaxmple来说是2.333,每天)-您将如何处理?
String[] propertyValues = "2.333,day".split(",");
您可以想象该代码变得非常冗长(我尚未实际编写,因此请忽略语法错误)
float timeComponent = Float.parseFloat(propertyValues[0]);
if (calendarMajorModifier == Calendar.DATE) {
int dayValue = Integer.parseFloat(timeComponent);
cal.add(calendarMajorModifier, dayValue);
timeComponent = (timeComponent - dayValue) * 24; //Need to convert a fraction of a day to hours
if (timeComponent != 0) {
calendarMajorModifier = Calendar.HOUR;
}
}
if (calendarMajorModifier == Calendar.HOUR) {
int hourValue = Integer.parseFloat(timeComponent);
cal.add(calendarMajorModifier, hourValue);
timeComponent = (timeComponent - hourValue) * 60; //Need to convert a fraction of an hour to minutes
if (timeComponent != 0) {
calendarMajorModifier = Calendar.MINUTE;
}
}
... etc
当然可以,我可以看到重构的机会,但看起来仍然是一个蛮横的解决方案。
我正在使用Calendar类进行操作,但从技术上讲可以是任何类。只要我可以在它们之间进行转换(即通过获取long值并使用它),函数需要即可返回Calendar类。理想情况下,该类还必须是Java本机,以避免第三方许可问题:)。
旁注:我建议将格式更改为yy:MM:ww:dd:hh:mm:ss以避免浮动值,但并没有成功。我还建议了2、5、5、2小时,但同样,最好在上面设置格式。
答案 0 :(得分:4)
我会将值转换为最小单位,然后加上:
float timeComponent = Float.parseFloat(propertyValues[0]);
int unitFactor = mapUnitToFactor(propertyValues[1]);
cal.add(Calendar.SECOND, (int)(timeComponent * unitFactor));
和mapUnitToFactor
类似于:
int mapUnitToFactor(String unit)
{
if ("sec".equals(unit))
return 1;
if ("min".equals(unit))
return 60;
if ("hour".equals(unit))
return 3600;
if ("day".equals(unit))
return 24*3600;
throw new InvalidParameterException("Unknown unit: " + unit);
}
例如,将2.333天变为201571秒。