xPages:当用户更改操作系统区域设置时,NotesDateTime对象出现问题

时间:2014-09-18 13:07:27

标签: date xpages xpages-ssjs

我在办公室里有小查询人们在Windows操作系统上使用两个区域设置。控制面板 - >区域和语言选择     1)英语(美国)     2)英语(英国)

您知道这会影响日期和时间格式,货币和数字设置。我在xpages中开发的应用程序会在操作系统区域设置设置为英语(英国)时产生冲突。在表单提交按钮上,我从组件中获取值并创建日期和时间对象,如下例所示,其中dateFrom是包含日期和时间控件的xpage上的组件名称,带有验证器和转换器(dd.MM.yyyy)。

当我在提交按钮后运行以下代码时,其工作正常,其中操作系统设置为英语(美国),但使用Windows设置为英语(英国)的客户端获得的结果不同,例如:如果一个人在此代码运行时从字段中选择08.09.2014(2014年9月8日),则创建包含09。08。2014年的对象(2014年8月9日)

    var dtFrom:NotesDateTime = session.createDateTime(getComponent("dateFrom").getValue()); 
    var weekDayStart = @Weekday(dtFrom.getDateOnly());
    var weekDayEnd = @Weekday(dtTo.getDateOnly());
    var warnMsg1 = viewScope.get("saturdayFlag");
    if ( weekDayStart == 7 && (warnMsg1 == null || warnMsg1 == "")) 
    { 
      getComponent("warningMessage").setValue("Warning: You are going start your leave on  SATURDAY. If you are OK with it than Press Submit Button."); 
      viewScope.put("saturdayFlag", "True"); 
      return "Warning1";
    }

我有很多业务规则依赖于这个对象。这件事影响了我的整个业务逻辑,目前应用程序正在生产中。您能否请进行调查,让我知道如何在配置或代码级别处理此问题。您在这方面的快速反应将受到高度赞赏。

编辑: 感谢您花时间和精力了解与此问题相关的痛苦。由于日期格式的变化,xpage下面的两个工作站基于其区域设置的行为不同。如何避免Lotus Client不应采用操作系统区域设置,因为这在浏览器上运行良好。

   <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText id="dateFrom" style="width:%" required="true"
        disableClientSideValidation="true">
        <xp:this.validators>
            <xp:validateRequired message="Please select Date From">
            </xp:validateRequired>
        </xp:this.validators>
        <xp:this.converter>
            <xp:convertDateTime pattern="dd.MM.yyyy" type="date"
                ignoreUserTimeZone="true" dateStyle="default" locale="en_US"
                >
            </xp:convertDateTime>
        </xp:this.converter>
        <xp:dateTimeHelper></xp:dateTimeHelper>
    </xp:inputText>&#160;&#160;
    <xp:button value="Display DT Object" id="button1"><xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:executeScript>
            <xp:this.script><![CDATA[#{javascript:var mDt:NotesDateTime =  session.createDateTime(getComponent("dateFrom").getValue());
var ni:NotesInternational = session.getInternational();

   if ( ni.isDateDMY())
   {    
    /// This Code is for English (United Kindom Settings)
    DATE_FORMAT = "dd/MM/yyyy"; 
        ///getComponent("inputText3").setValue(mDt.getDateOnly());//return; 
    ///var mDt3:Date = new  Date(mDt.toJavaDate());//I18n.parseDate(@Text(mDt.getDateOnly()), DATE_FORMAT,  I18n.getServerLocale() , I18n.getServerTimeZone());
    ///var mMonth = mDt3.getMonth() + 1;    
    //var mStr:string = @Text(mMonth)+"/"+mDt3.getDate()+"/"+mDt3.getFullYear();    
    //var mDt4:NotesDateTime =   session.createDateTime(mDt.toJavaDate().getMonth()+1+"/"+mDt.toJavaDate().getDate()+"/"+mDt.toJavaDate().getFullYear());   
/// var mDt4:NotesDateTime = session.createDateTime(@Text(mDt.toJavaDate()));
    ///getComponent("inputText5").setValue(    mDt.toJavaDate().getMonth()+1+"/"+mDt.toJavaDate().getDate()+"/"+mDt.toJavaDate().getFullYear());
        //mDt2:NotesDate
    //getComponent("inputText5").setValue(mDt9.toJavaDate() - mDt.toJavaDate());
    getComponent("inputText1").setValue(@Day(mDt.getDateOnly()));// Showing Day of Date Object; 
    getComponent("inputText2").setValue(@Month(mDt.getDateOnly())); // Showing Month of D ate Object    
    getComponent("inputText4").setValue(@Weekday(mDt.getDateOnly())); /// Showing Weekday of Date Object        
    }
   else
    {
   // This Code is for English ( United States) Regional Settings at OS LEVEL
      getComponent("inputText1").setValue(@Day(mDt.getDateOnly()));// Showing Day of Date Object;   
      getComponent("inputText2").setValue(@Month(mDt.getDateOnly())); // Showing Month of Date Object   
    getComponent("inputText4").setValue(@Weekday(mDt.getDateOnly())); //
}
}]]></xp:this.script>
        </xp:executeScript>
    </xp:this.action></xp:eventHandler></xp:button>


    <xp:br></xp:br>
    <xp:table>
        <xp:tr>
            <xp:td><xp:span style="font-weight:bold">Day is : </xp:span></xp:td>
            <xp:td><xp:inputText id="inputText1" style="font-weight:bold"></xp:inputText></xp:td>


        </xp:tr>
        <xp:tr>
            <xp:td><xp:span style="font-weight:bold">Month is :</xp:span></xp:td>
            <xp:td><xp:inputText id="inputText2" style="font-weight:bold"></xp:inputText></xp:td>


        </xp:tr>
        <xp:tr>
            <xp:td><xp:span style="font-weight:bold">weekDay  </xp:span></xp:td>
            <xp:td><xp:inputText id="inputText4" style="font-weight:bold"></xp:inputText></xp:td>


        </xp:tr>
        <xp:tr>
            <xp:td><xp:span style="font-weight:bold">Zone ID :</xp:span></xp:td>
            <xp:td><xp:inputText id="inputText5" style="font-weight:bold"></xp:inputText>  </xp:td>


        </xp:tr>
    </xp:table>
    </xp:view>

1 个答案:

答案 0 :(得分:0)

我无法在XPiNC中使用您的示例代码。它将值始终设置为“0.0”。但是,以下代码在我的XPiNC中可以正常工作:

var date:java.util.Date = getComponent("dateFrom").getValue();
var cal:java.util.Calendar = java.util.Calendar.getInstance();
cal.setTime(date);
getComponent("inputText1").setValue(cal.get(java.util.Calendar.DAY_OF_MONTH));  
getComponent("inputText2").setValue(cal.get(java.util.Calendar.MONTH) + 1);   
getComponent("inputText4").setValue(cal.get(java.util.Calendar.DAY_OF_WEEK));

只需替换操作脚本中的代码,并与示例XPage的其余部分保持一致。

更新

代码中的问题是由使用@Day,@ Moon,@ Weekday和类似函数与NotesDateTime参数引起的。它必须是Date参数。这是definition

@Day(time:Date) : int
@Month(time:Date) : int
@WeekDay(time:Date) : int

令人惊讶的是,它适用于浏览器中的 NotesDateTime参数,但在XPiNC中失败。对于类似的案例,请查看最后评论here

建议:

如果你想确保它适用于所有环境,那么请使用java.util.Date而不是NotesDateTime。

使用

获取文档的DateTime项的java.util.Date值
var dateDoc:java.util.Date = document1.getItemValueDateTime("DateItem").toJavaDate();

您可以在.getTime()的帮助下计算两个日期的差异,它返回自1970年1月1日00:00:00 GMT以来的毫秒数。例如,您可以获得以下天数的差异:

(date.getTime() - dateDoc.getTime()) / (1000*60*60*24)