这篇XNPV其实和上篇的XIRR有相似之处 就是计算方式不同 office和百度提供的XNPV函数公式好像是错误的
这里边括号里的(di d1)中间应该是减号 如果是乘积的话 计算器都计算不出结果的
这里的也同样是需要三个类 粘贴到下面 可以直接复制使用 最后我补上test测试类
第一个
package com.p1.excel.XNPV;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
*
* @{# DateUtil.java Create on 2013-4-9
*
* class desc:
*
* <p>
* Copyright: Copyright(c) 2013
* </p>
* <p>
* Company: morelap
* </p>
* @Version 1.0
* @Author <a href="mailto:morelap@morelap.com">Morelap</a>
*
*
*/
public class DateUtil {
public static final long Minute_MilliSecond = 60 * 1000;
public static final long Hour_MilliSecond = Minute_MilliSecond * 60;
/**
* milliseconds of a day
*/
public static final long Day_MilliSecond = Hour_MilliSecond * 24;
/**
* milliseconds of a week
*/
public static final long Week_MilliSecond = Day_MilliSecond * 7;
/**
* milliseconds of a month
*/
public static final long Month_MilliSecond = Week_MilliSecond * 30;
/**
* yyyyMMdd
*/
public static final String Date_Default_Formate = "yyyyMMdd";
/**
* yyyy-MM-dd HH:mm:ss 2010-05-11 17:22:26
*/
public static final String Date_Formate_All = "yyyy-MM-dd HH:mm:ss";
/**
* dd/MM/yyyy, hh:mm
*/
public static final String DATE_FORMATE_TRANSACTION = "dd/MM/yyyy, hh:mm";
/**
* MM/dd HH:mm
*/
public static final String DATE_FORMATE_DAY_HOUR_MINUTE = "MM/dd HH:mm";
/**
* HH:mm
*/
public static final String DATE_FORMATE_HOUR_MINUTE = "HH:mm";
public static final String DATE_FORMATE_HOUR_MINUTE_SECOND = "HH:mm:ss";
public static SimpleDateFormat dateFormate = new SimpleDateFormat();
/**
* 获取当前的字符串日期
*
* @param splite
* 格式的分割线如 - 则获取的日期时间格式如下:
* @return 返回2013-07-19
*/
public static String getNowStringDate(String splite) {
StringBuffer format = new StringBuffer();
if (splite == null) {
format.append(Date_Default_Formate);
} else {
format.append("yyyy").append(splite).append("MM").append(splite)
.append("dd");
}
return (new SimpleDateFormat(format.toString())).format(new Date());
}
/**
* 获取当前的字符串日期时间
*
* @param splite
* 格式的分割线如 - 则获取的日期时间格式如下:
* @return 返回2013-07-19 09:08:22
*/
public static String getNowStringDateTime(String splite) {
StringBuffer format = new StringBuffer();
if (splite == null) {
format.append(Date_Default_Formate);
} else {
format.append("yyyy").append(splite).append("MM").append(splite)
.append("dd").append(" HH:mm:ss");
}
return (new SimpleDateFormat(format.toString())).format(new Date());
}
/**
* 获取当前的字符串期时间
*
* @param splite
* 格式的分割线如 - 则获取的日期时间格式如下:
* @return 返回09:08:22
*/
public static String getNowStringTime() {
StringBuffer format = new StringBuffer(DATE_FORMATE_HOUR_MINUTE_SECOND);
return (new SimpleDateFormat(format.toString())).format(new Date());
}
/**
* 获取昨天的日期
*
* @return Date
*/
public static Date getYesterdayDate() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
}
/**
* 获取指定日期的后面的一天 即日期+1
*
* @param stringDate
* 格式为:2012-02-02
* @return Date
*/
public static Date getForwardDate(String stringDate) {
int year = Integer.parseInt(stringDate.substring(0, 4));
int month = Integer.parseInt(stringDate.substring(5, 7));
int day = Integer.parseInt(stringDate.substring(8, 10));
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1);
c.set(Calendar.DAY_OF_MONTH, day);
c.add(Calendar.DATE, 1);// 在此日期的基础上+1
return c.getTime();
}
/**
* 获取指定日期的后面的一天 即日期+1
*
* @param stringDate
* 格式为:2012-02-02
* @return Date
*/
public static String getForwardStringDate(String stringDate, String splite) {
int year = Integer.parseInt(stringDate.substring(0, 4));
int month = Integer.parseInt(stringDate.substring(5, 7));
int day = Integer.parseInt(stringDate.substring(8, 10));
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1);
c.set(Calendar.DAY_OF_MONTH, day);
c.add(Calendar.DATE, 1);// 在此日期的基础上+1
return getStringDateByDate(c.getTime(), splite);