将浮动添加到Java日历

时间:2018-10-01 14:42:32

标签: java

我目前正在开发一些需要为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小时,但同样,最好在上面设置格式。

1 个答案:

答案 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秒。