如何在GWT中使用java.util.Calendar

22

我需要在GWT入口点中使用java.util.Calendar,但是运行应用程序时我遇到了错误,因为GWT无法找到源代码,有没有办法可以解决这个问题。

提前感谢!

6个回答

23

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)之间建立关联。使用三元组和时区,您可以轻松创建特定时间的实例。


谢谢你告诉我java.util.Date确实可行,对于我的需求来说这非常完美! - AmanicA
为了解决这个问题,我不得不创建自己的Time类来处理我的用例,该类使用java.util.Date。https://github.com/tugalsan/com.tugalsan.api.time - Tugalsan Karabacak

18
您可以尝试使用com.google.gwt.user.datepicker.client.CalendarUtil

6

没有办法在GWT中使用java.util.Calendar,因为JavaScript中没有相应的等价物。但是有一个已被接受的功能请求。也许您会在请求的评论中找到一些提示。


3

以下展示了如何使用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);
}

0

对于那些喜欢直接实现数学计算的人,这里提供一种解决方案,可以在不使用日历或任何已弃用函数的情况下将天数添加到现有日期对象中:

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);

在谷歌上查找像一天、一年等常量的毫秒数很容易。但是添加月份会比较棘手,因为一个月的毫秒数将取决于月份。如果有需要的话,我很乐意编写一个函数并在此处发布,以便添加和减去月份。


只要您不关心夏令时转换期,这可能很好用。以下是您方法的输出(所有日期均为纽约时区):addDays(2013-11-03T01:00,1)= 2013-11-04T00:00。请注意,小时字段偏移了一个小时。如果您只想更改日期,则使用像Joda这样值得信赖的库更容易。LocalDateTime.plusDays和DateTime.plusDays都返回预期的结果(2013-11-04T01:00)。 - nogridbag
完全同意 @nogridbag 的观点,除了 Joda 不被 GWT 支持。GWT 没有可用的好日期类。 - Geoffrey Wiseman

0

你尝试过将类的实际代码添加到项目中吗?一些Java SDK类即使不在JRE白名单中,也可以编译成功。


我有一种感觉,由于JavaScript中的时区混乱,日历可能不会正常工作。 - djjeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接