日期项目中的错误,夏令时

时间:2013-01-11 10:05:10

标签: datetime xpages

重新计算1981年之前输入控件中的夏季日期(我认为夏令时)。

e.g。 例如我输入了27.8.1960 - 保存之后我得到了26.8.1960,(在下一次保存后的25.8.1960等等)之后 但是在2010年8月27日 - 保存之后它保持不变:27.8.2010

“冬季约会”:27.4.1960 - 保存之后保持不变:27.4.1960

看起来像一个丑陋的小虫。我怎么能压制这个“计算”?

(日期格式为Europeen,我住在德国。1960年8月27日是1960年8月27日)

感谢任何帮助,Uwe

<xp:inputText value="#{Auftrag.MF_GebDatum}" id="mF_GebDatum1" style="width:255px">
    <xp:this.converter>
        <xp:convertDateTime type="date"></xp:convertDateTime>
    </xp:this.converter>
</xp:inputText>

1 个答案:

答案 0 :(得分:0)

您正在解决的问题是Domino存储日期时间值以及您输入的日期不存在的夏令时信息。要使用的时区信息来自当前用户区域设置和/或服务器。

您的日期存储在一个字段中,其中包含输入的时区(+格林威治标准时间2小时)

26.08.1960 00:00:00 CEDT

Domino按原样解释存储的值,而不进行调整

var ndt:NotesDateTime = session.createDateTime("26.08.1960 00:00:00 CEDT");
ndt.getGMTTime()

返回正确的日期时间值,GMT调整2小时

25.08.60 22:00:00 GMT

虽然转换回Java,但它被正确地解释为1960年从未有过夏令时,这就是为什么它只能调整1小时:

var ndt:NotesDateTime = session.createDateTime("26.08.1960 00:00:00 CEDT");
ndt.toJavaDate().toLocaleString()
如果您在CEDT时区,

将导致“25.08.1960 23:00:00”。

目前,我有一个简单的解决方法是杀死DateTime字段中的时区信息。为此,您可以使用此SSJS脚本:

<xp:this.querySaveDocument>
   <![CDATA[#{javascript:
      var doc:NotesDocument = document1.getDocument( true );
      var items:java.util.Vector = doc.getItems();
      var item:NotesItem;
      var ndt:NotesDateTime;
      var dt:java.util.Date;

      for( var i=0; i<items.size(); i++){
         item = items.get(i);
         if( item.getType() === 1024 ){
            ndt = item.getValueDateTimeArray().get(0);  
            ndt = session.createDateTime( ndt.getDateOnly());
            item.setDateTimeValue( ndt );
            ndt.recycle();
         }
         item.recycle();
      }
   }]]>
</xp:this.querySaveDocument>