在项目管理软件中渲染甘特图时,将日期转换为X轴上的点,以及将X轴上的点转换回日期,是最基本的计算之一。本文将介绍背后的基本数学原理,并展示如何在Java中实现这些转换。
首先,需要了解这些计算背后的基本数学原理。算法可以适用于任何单位,但本文中将使用像素作为单位。其次,选择天数作为时间单位,但根据需求,其他单位(如秒、分钟等)同样适用。
要将日期转换为X轴上的点,需要知道以下信息:
有了这三个信息,可以使用一个简单的公式来计算X值:
X = (D - S) * W
要将点转换回日期,只需解上述方程求D:
D = (X / W) + S
这个类需要跟踪S和W,即公式中的起始日期和每天的宽度。还需要一个常量来将毫秒转换为天数。
private Date start = null;
private double dayWidth = 0;
private double lengthOfDayInMs = 86400000f;
要实例化并初始化这个类,提供一个构造函数,传入S和W:
public PointConverter(Date start, float width) {
this.dayWidth = width;
this.start = start;
}
转换函数使用上面的公式(需要将天数转换为毫秒以确保单位一致):
public float dateToPoint(Date d) {
long elapsed = d.getTime() - start.getTime();
double daysPast = ((float)(elapsed / lengthOfDayInMs));
return ((float)(daysPast * dayWidth));
}
public Date pointToDate(float x) {
long elapsed = start.getTime() + ((long)((x / dayWidth) * lengthOfDayInMs));
return new Date(elapsed);
}
public void update(Date start, float width) {
this.start = start;
this.dayWidth = width;
}