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

Java Jena-在xml dateTime中存储日期-意外行为,java,rdf,jena,ontology,Java,Rdf,Jena,Ontology,我正在使用…,model.createTypedLiteral(cal))存储xml dateTime dataTypeProperty的值 问题是,我的本地时区(UTC+05:00)伊斯兰堡(卡拉奇)PKT中没有保存时间。当ISystem.get.out.println(cal)时,它显示本地时区的时间。但是当我这样做…,model.createTypedLiteral(cal))并将其写入owl文件时,小时部分会被保存,减去5小时(-05:00)。这是我的密码: ... 1)Date dat

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

问题是,我的本地时区(UTC+05:00)伊斯兰堡(卡拉奇)PKT中没有保存时间。当I
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=11

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

<created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
>2014-07-27T06:07:42.261Z</created>
第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为单位显示时间

请告诉我问题在哪里

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

PS

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

    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类型的类型化文本;日期时间


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

它显示本地时区的时间。但是当我把它写在owl文件上时,小时部分被保存下来,减去5小时(-05:00)。您显示的输出是2014-07-27T06:07:42.261Z。结尾的Z表示它正在保存标准化为GMT的日期时间。这是同一时间,只是为不同的时区写入。@JoshuaTaylor是否可以在owl文件上以本地时间写入xml:DateTime?嗯,这是同一时间,所以我不知道RDF库是否会倾向于标准化(这其实并不重要,因为毕竟你还在谈论同一个时间),但是你可以用词法形式和数据类型手动构造一个类型化的文本。我认为一个实现仍然可以规范化,就像“1”^^xsd:boolean和“true”^^xsd:boolean代表相同的值一样。
com.hp.hpl.jena.sparql.util.NodeFactoryExtra.dateTimeToNode
com.hp.hpl.jena.sparql.util.Utils.calendarToXSDDateTimeString(...)