【问题标题】:How To properly format Date string from DateTimePicker for parsing by SimpleDateFormat?如何正确格式化 DateTimePicker 中的日期字符串以供 SimpleDateFormat 解析?
【发布时间】:2014-10-14 17:27:32
【问题描述】:

我正在使用jQuery DateTimePicker 从我创建的JSP 表单中获取用户选择的日期和时间(带时区)。我是Javascript 的新手,所以我的方法或代码可能会出错。所以如果我是,请指出,以便我学习。

日期/时间 jQuery 选择器显示并按预期工作,但是我需要将其数据发送到我创建的 Java servlet,然后使用该日期数据在我的 Parse.com 数据库中创建一个新的 Parse 对象。根据Parse's docs,为一个对象存储的Date字段如下:

"Date 类型包含一个包含 UTC 时间戳的字段 iso 以 ISO 8601 格式存储,精度为毫秒: YYYY-MM-DDTHH:MM:SS.MMMZ。”

基本上,我需要重新格式化表单返回的日期以符合 Parse 的要求,我将在我的 servlet 中使用 SimpleDateFormat 来完成。 (我已经能够在 Java 中使用 Date object 做到这一点,因此另一种解决方案是将日期数据作为日期对象直接从 jsp 发送。如果可能,请告诉我如何。 )

我将formatting for SimpleDateFormat 与DatePicker format 和TimePicker format 进行了匹配,这样SimpleDateFormat 就能够毫无问题地将Date 字符串解析并重新格式化为我的servlet 中的Date 对象。 (诅咒在处理日期和时间时允许使用如此多种格式而不是使用一种通用格式的人...... T_T)(也许这是我做错的部分?有人愿意仔细检查吗?) 所以我更改了DateTimePicker 中的格式以匹配 SimpleDateFormat 的格式,同时保持用户可读性:

<script>
$(function() {
    $("#timezone_datetimepicker").datetimepicker({
        dateFormat: 'mm-dd-yy', 
        timeFormat: 'HH:mm Z',
        onClose: function (dateText) {
            $(this).datetimepicker.formatTime('HH:mmZ', dateText);
            }
    });
});

onClose 的函数是我尝试在将格式发送到servlet 之前以精确的精度将格式与 SimpleDateFormat 匹配。我基于TimePicker's examples:中提到的实用函数

使用实用程序函数来格式化您自己的时间。 $.datepicker.formatTime(格式、时间、选项)

$('#utility_example_2').text(
$.datepicker.formatTime('HH:mm z', { hour: 14, minute: 36, timezone: '+2000' }, {})

);

不管我做了多少次尝试和变化,这是失败的部分,我需要帮助。当我尝试使用 SimpleDateFormat 解析传递过来的日期字符串时:

SimpleDateFormat formatter1 = new SimpleDateFormat("MM-dd-yyyy HH:mm z");       
SimpleDateFormat formatter2 = new SimpleDateFormat("MM-dd-yyyy'T'HH:mmz");
try {
        //datePicked and datePickedFormatted are global Date variables
        datePicked = formatter1.parse(request.getParameter("sendTime"));
        datePickedFormatted = formatter2.parse(datePicked.toString());
    } catch (ParseException e1) {
        System.out.println("Date formatter failed to parse chosen sendTime.");
        e1.printStackTrace();
    }

我在日志中收到此错误:

java.text.ParseException:无法解析的日期:“08-22-2014 05:18 -04:00”

为什么当我尝试格式化它以匹配 SimpleDateFormat 时,它仍然被发送到像这样格式化的 servlet?为什么 SimpleDateFormat 不接受?

我什至尝试使用 Joda-Time 解析日期字符串,而不是使用 SimpleDateFormat,但即使这样也没有用:

DateTime dt = new DateTime(request.getParameter("sendTime"));

任何帮助或 cmets 将不胜感激。谢谢。

【问题讨论】:

  • 您是否尝试过使用大写的“Z”而不是小写的“z”?或者猜测它甚至应该是'X'
  • 大写“Z”以同样的方式失败,当我使用“X”时,它通过了第一个 SimpleDateFormat 格式化程序,因此它接受表单中的日期字符串。但是,第二个格式化程序失败并显示此日期:java.text.ParseException: Unparseable date: "Fri Aug 22 04:28:00 EDT 2014"。我需要第二个格式化程序的格式才能将它存储在我的 Parse.com 数据库中。
  • 为什么你的模式中有 T?我认为这是一个例外。
  • 在第二个格式化程序'EEE MMM d HH:mm:ss z yyyy'中使用它
  • @sandris Parse 似乎需要它——没有它,Parse 的服务器会拒绝它。请参阅我过去提出的问题的答案:link。

标签: java jquery jsp parse-platform datetimepicker


【解决方案1】:

我已经解决了这个问题,多亏了用户的 cmets,我抢占了先机。我所做的是使用SimpleDateFormat 将到达日期字符串的格式解析为Date object。然后我用那个Date object构造了一个DateTime对象(Joda-Time):

datePicked = formatter1.parse(request.getParameter("sendTime"));
DateTime dt = new DateTime(datePicked);

DateTime 默认为UTC format 和ISO-8601,因此Parse.com 的数据库可以毫无问题地接受.toString() 方法。这是最终有效的代码:

    SimpleDateFormat formatter1 = new SimpleDateFormat("MM-dd-yyyy HH:mm X");       
    try {
        datePicked = formatter1.parse(request.getParameter("sendTime"));
        System.out.println("Retrieved and formatted dateTime: " + datePicked.toString());
    } catch (ParseException e1) {
        System.out.println("Date formatter failed to parse chosen sendTime.");
        e1.printStackTrace();
    }
    DateTime dt = new DateTime(datePicked);

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多