java - Jena- 在 xml dateTime 中存储日期- 意外行为

标签 java rdf jena ontology

我正在使用 ...,model.createTypedLiteral(cal)) 来存储 xml dateTime dataTypeProperty 的值。

问题是,时间未保存在我的本地时区 (UTC+05:00) 伊斯兰堡、卡拉奇) PKT 中。当我System.get.out.println(cal)时,它显示了本地时区的时间。但是,当我执行此操作 ...,model.createTypedLiteral(cal)) 并将其写入 owl 文件时,小时部分将在减去 5 小时后保存(-05:00)。这是我的代码:

...
1)Date date = new Date();
2)Calendar cal = Calendar.getInstance();
3)cal.setTime(date);

4)System.out.println(cal);
...
5)Resource resource = model.createResource(resourceURI);
6)resource.addProperty(model.createProperty(baseURI+propertyName), model.createTypedLiteral(cal));
...
write model on owl file
...

第 4 行打印

java.util.GregorianCalendar[time=1406441262261,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Karachi",offset=18000000,dstSavings=0,useDaylight=false,transitions=12,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_YEAR=208,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=7,SECOND=42,MILLISECOND=261,ZONE_OFFSET=18000000,DST_OFFSET=0]

查看HOUR=11, HOUR_OF_DAY=11其正确的本地时间。

但是第 6 行和第 6 行之后将相同内容写入 owl 文件,并在 owl 中保存为

<created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
>2014-07-27T06:07:42.261Z</created>

这是我本地时间的 -5:00。

我编写了代码从 owl 文件中检索它并在屏幕上打印

    1)List<String> dlist = new ArrayList<String>();
    2)dlist= ...;
    3)System.out.println(dlist.get(0));

     String s = dlist.get(0);
     SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
     try {
        Date date1 = sd.parse(s);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);
    4)  System.out.println(cal);
    5)  System.out.println(cal.getTime()+" "+cal.getTimeZone());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

输出:

第 3 行

2014-07-27T06:07:42.261Z^^http://www.w3.org/2001/XMLSchema#dateTime

第 4 行

java.util.GregorianCalendar[time=1406423262000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Karachi",offset=18000000,dstSavings=0,useDaylight=false,transitions=12,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=27,DAY_OF_YEAR=208,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=6,HOUR_OF_DAY=6,MINUTE=7,SECOND=42,MILLISECOND=0,ZONE_OFFSET=18000000,DST_OFFSET=0]

5号线

Sun Jul 27 06:07:42 PKT 2014 sun.util.calendar.ZoneInfo[id="Asia/Karachi",offset=18000000,dstSavings=0,useDaylight=false,transitions=12,lastRule=null]

所有输出显示的时间为 -5:00

请问问题出在哪里?

======================

附注

如果上面的例子很复杂,那么这里是简单的:

    Model model = ModelFactory.createDefaultModel();
    Resource resource = model.createResource("http://example.com/resource/test");
    Property property = model.createProperty("http://example.com/prop/test");
    Calendar cal = GregorianCalendar.getInstance();
    System.out.println("Current time is. cal="+cal.getTime());
    Literal value = model.createTypedLiteral(cal);
    System.out.println("Current time saved in value as= "+value);
    String s1 = value.toString();
    SimpleDateFormat sd1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date date3;
    try {
        date3 = sd1.parse(s1);
        cal.setTime(date3);
        System.out.println("Retrieving back the time from value variable as date="+cal.getTime());
    resource.addProperty(property, value);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

输出:

Current time is. cal=Sun Jul 27 13:04:53 PKT 2014
Current time saved in value as= 2014-07-27T08:04:53.681Z^^http://www.w3.org/2001/XMLSchema#dateTime
Retrieving back the time from value variable as date=Sun Jul 27 08:04:53 PKT 2014

结果中,第一行和第二行显示的时间不同。为什么会这样呢?

最佳答案

尝试

中的代码
com.hp.hpl.jena.sparql.util.NodeFactoryExtra.dateTimeToNode

或者它使用的例程:

com.hp.hpl.jena.sparql.util.Utils.calendarToXSDDateTimeString(...)

要获取词法形式,请创建 xsd;dateTime 类型的类型文字。

这些补偿了 Xerces 标准化为 Z 时区的事实。

关于java - Jena- 在 xml dateTime 中存储日期- 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24978636/

相关文章:

java - 替换@TransactionConfiguration

java - 如何更改某种类型的所有组件的 UI?

java - 在屏幕上旋转时,仅应显示视频

sparql - 如何标准化此数据

rdf - 使用变量与 IRI 的奇怪 SPARQL 行为

java - 如何在 SPARQL 中过滤 DBpedia 结果

java - 结合Java和xml spring配置进行测试

sparql - MarkLogic 返回的数字不使用科学记数法

java - Apache 耶拿 - java.lang.UnsupportedClassVersionError : com/hp/hpl/jena/rdf/model/ModelFactory

java - 查询解决方案,保留 "< >"