【问题标题】:Creating Java object with boost::posix_time::ptime serialized XML representation使用 boost::posix_time::ptime 序列化 XML 表示创建 Java 对象
【发布时间】:2011-01-06 17:10:37
【问题描述】:

我通过序列化 boost::posix_time::ptime 结构生成了以下 XML。我想用这个 XML 创建一个 Java Date 对象。

<timeStamp class_id="0" tracking_level="0" version="0">
    <ptime_date class_id="1" tracking_level="0" version="0">
        <date>20100119</date>
    </ptime_date>
    <ptime_time_duration class_id="2" tracking_level="0" version="0">
        <time_duration_hours>11</time_duration_hours>
        <time_duration_minutes>53</time_duration_minutes>
        <time_duration_seconds>33</time_duration_seconds>
        <time_duration_fractional_seconds>0</time_duration_fractional_seconds>
    </ptime_time_duration>
</timeStamp>

下面是应该通过反序列化此 XML 来构造 Date 对象的 Java 代码。我面临的问题是如何将 标记分解为年/月/日序列。

Integer date = timeStamp.getPtimeDate().getDate();
Integer hrs = timeStamp.getPtimeTimeDuration().getTimeDurationHours();
Integer mins = timeStamp.getPtimeTimeDuration().getTimeDurationMinutes();
Integer secs = timeStamp.getPtimeTimeDuration().getTimeDurationSeconds();

Calendar cal = Calendar.getInstance();
//TODO
//cal.set(year, month, day, hrs, mins, secs);
Date date = cal.getTime();

有什么提示吗?

编辑:

我正在寻找一些不需要将日期转换为字符串然后拆分它的优雅解决方案。那将是我最后的手段。

谢谢

【问题讨论】:

    标签: java c++ xml serialization boost


    【解决方案1】:

    由于您不想使用String(尽管我敦促您重新考虑,毕竟它就是这样并且也更容易解析),我想您可以执行常规的旧除法来提取部分。即

    int tmp = date; // unboxing
    int year = tmp / 10000;
    int month = (tmp % 10000) / 100;
    int day = tmp % 100;
    

    这也不是很优雅。

    处理此问题的最佳方法是指示您用于反序列化的任何内容为date 返回String,而不是Integer。然后,您可以将前四个字符作为您的字符,接下来的两个字符作为月份,最后两个字符作为一天。 SimpleDateFormat 可以在这里完成繁重的工作。

    【讨论】:

    • 我还是继续使用 subString() 方法,因为它比模除法更容易阅读。
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 2017-10-13
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多