开始日期是今天,结束日期应该是今天的日期+ 3年 例如:
TODAY=3.1.2013 and
END DATE=3.1.2016
这是截图
;
Date begindate = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(begindate);
int today = cal.get(Calendar.DAY_OF_WEEK);
cal.add(Calendar.YEAR, 3);
Date enddate = cal.getTime();
Date currentdate = begindate;
while (true) {
if (currentdate.getTime() >= enddate.getTime()) {
break;
} else {
}
Calendar c = Calendar.getInstance();
c.setTime(begindate);
c.add(Calendar.DATE, x++);
Date newdate = c.getTime();
int day = c.get(Calendar.DAY_OF_WEEK);
currentdate = newdate;
}
答案 0 :(得分:4)
好的,不是试图预先计算每个Date
,而是可以根据需要动态计算值...
我应该补充一点,这只是一种可能的方法......
基本上,使用开始日期和结束日期,您可以计算它们之间的天数,计算您需要的行数,然后在需要时根据日期从日历开始计算Date
当前行和列。
以下示例使用Joda Time执行许多日期计算,因为它比构建Calendar
(IMHO)中的Java更可靠,更易于使用
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.MutableDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class BuildCalendar {
public static void main(String[] args) {
new BuildCalendar();
}
public BuildCalendar() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM.dd.yyyy");
DateTime startDate = dtf.parseDateTime("3.1.2013");
DateTime endDate = dtf.parseDateTime("3.1.2016");
JTable table = new JTable(new CalendarModel(startDate, endDate));
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class CalendarModel extends AbstractTableModel {
public static String[] COLUMN_NAMES = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
private int rows = 0;
private MutableDateTime startOfWeek;
private DateTime startDate;
private DateTime endDate;
public CalendarModel(DateTime startDate, DateTime endDate) {
this.startDate = startDate;
this.endDate = endDate;
int days = Days.daysBetween(startDate, endDate).getDays();
if (days > 0) {
startOfWeek = new MutableDateTime(startDate);
while (startOfWeek.getDayOfWeek() != DateTimeConstants.SUNDAY) {
startOfWeek.addDays(-1);
}
int offset = Days.daysBetween(startOfWeek, startDate).getDays();
days += offset;
System.out.println(NumberFormat.getNumberInstance().format(days / 7d));
rows = (int) Math.round(days / 7d) + 1;
System.out.println(rows);
}
}
@Override
public int getRowCount() {
return rows;
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return Date.class;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Date date = null;
if (startOfWeek != null) {
MutableDateTime dt = new MutableDateTime(startOfWeek);
int day = (rowIndex * 7) + columnIndex;
dt.addDays(day);
if (dt.isBefore(startDate) || dt.isAfter(endDate)) {
date = null;
} else {
date = dt.toDate();
}
}
return date;
}
}
}
已更新为Calendar
示例
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
public class BuildCalendar {
public static void main(String[] args) {
new BuildCalendar();
}
public BuildCalendar() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM.dd.yyyy");
Date startDate = sdf.parse("3.1.2013");
Date endDate = sdf.parse("3.1.2016");
JTable table = new JTable(new CalendarModel(startDate, endDate));
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (ParseException | HeadlessException exp) {
exp.printStackTrace();
}
}
});
}
public static class CalendarModel extends AbstractTableModel {
public static String[] COLUMN_NAMES = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
private int rows = 0;
private Date startOfWeek;
private Date startDate;
private Date endDate;
public CalendarModel(Date startDate, Date endDate) {
this.startDate = startDate;
this.endDate = endDate;
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
while (cal.getTime().before(endDate)) {
cal.add(Calendar.DATE, 7);
rows++;
}
rows++;
if (rows > 0) {
int offset = 0;
cal.setTime(startDate);
while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
cal.add(Calendar.DATE, -1);
offset++;
}
startOfWeek = cal.getTime();
System.out.println("Start @ " + cal.getTime());
System.out.println("rows = " + rows);
}
}
@Override
public int getRowCount() {
return rows;
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return Date.class;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Date date = null;
if (startOfWeek != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(startOfWeek);
int day = (rowIndex * 7) + columnIndex;
System.out.println("day = " + day);
cal.add(Calendar.DATE, day);
if (cal.getTime().before(startDate) || cal.getTime().after(endDate)) {
date = null;
} else {
date = cal.getTime();
System.out.println("Real date = " + date);
}
}
return date;
}
}
}
答案 1 :(得分:0)
使用JTable(Object[][] rowData, Object[] columnNames)
构造函数。
为了构建rowData,首先要创建一个星期几和日期的地图:
Map<Integer, List<Date>> dateMap = new HashMap<Integer, List<Date>>();
//Initialize
for (int i = Calendar.SUNDAY; i <= Calendar.SATURDAY; ++i) {
dateMap.put(i, new ArrayList<Date>());
}
在循环中,向地图添加值:
dateMap.get(day).add(currentdate);
在构建JTable
之前,请将dateMap
转换为Object[][]