我需要在GWT入口点中使用java.util.Calendar,但是运行应用程序时我遇到了错误,因为GWT无法找到源代码,有没有办法可以解决这个问题。
提前感谢!
java.util.Calendar不是一个模拟类。您可以在此处找到模拟类的列表:
http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html
我强烈建议不要在客户端使用任何日期/日历库。您可能只会让自己陷入麻烦。实际上,即使java.sql.Date和java.util.Date在GWT中被模拟,我也不会使用它们。如果您想使用Calendar,则很有可能您想在客户端支持时区。使用模拟的Date类,您必须将浏览器时区的客户端日期转换为某个目标时区(GMT或用户在用户首选项中定义的任何时区)。这肯定会容易出现错误。使用GWT的TimeZone会带来其他问题。例如,如何在Java TimeZones和GWT TimeZones之间进行映射?
我建议在服务器上执行所有日期操作和格式化。在客户端上,您可以简单地使用日期/月份/年份三元组。服务器可以在用户(或组织)和java.util.TimeZone(或joda timezone)之间建立关联。使用三元组和时区,您可以轻松创建特定时间的实例。
com.google.gwt.user.datepicker.client.CalendarUtil
。没有办法在GWT中使用java.util.Calendar
,因为JavaScript中没有相应的等价物。但是有一个已被接受的功能请求。也许您会在请求的评论中找到一些提示。
以下展示了如何使用Joda Time从Java Date
类型中提取任何日期信息,使用Joda Times的format()
函数构建一个new Date()
,并使用Joda Time的parse()
函数。
static DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS");
static DateTimeFormat datefmt = DateTimeFormat.getFormat("yyyy-MM-dd ");
static DateTimeFormat timefmt = DateTimeFormat.getFormat("HH:mm:ss.SSS");
public Date getDateTime(Date date, Date time) {
String datetime = datefmt.format(date) + timefmt.format(time);
return dtf.parse(datetime);
}
对于那些喜欢直接实现数学计算的人,这里提供一种解决方案,可以在不使用日历或任何已弃用函数的情况下将天数添加到现有日期对象中:
private Date addDays(Date dateIn, int numDays)
{
long milisPerDay = 86400000;
// convert the dateIn to milliseconds
long dateInMilis = dateIn.getTime();
// add numDays to the date
dateInMilis = dateInMilis + (numDays * milisPerDay);
return new Date(dateInMilis);
}
以下是如何将当前年份作为字符串获取(非常适用于版权声明)
long time = System.currentTimeMillis();
long milisPerYear = new BigInteger("31536000000").longValue();
String currentYear = String.valueOf((int) Math.floor(time / milisPerYear) + 1970);
在谷歌上查找像一天、一年等常量的毫秒数很容易。但是添加月份会比较棘手,因为一个月的毫秒数将取决于月份。如果有需要的话,我很乐意编写一个函数并在此处发布,以便添加和减去月份。
你尝试过将类的实际代码添加到项目中吗?一些Java SDK类即使不在JRE白名单中,也可以编译成功。