我在办公室里有小查询人们在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>  
<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>
答案 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)