XPages:使用浏览器的语言环境将DateTime值转换为字符串

时间:2015-11-18 17:11:10

标签: datetime xpages

previous one I asked类似的问题,但不同之处在于这不是来自基础字段的直接呈现 - 而是部分SSJS的一部分。

这是一个视图列,它显示SSJS函数的结果,该函数返回渲染的HTML。此HTML包含DateTime字段中的日期,该日期使用@Text转换为文本。我遇到的问题是,@ Text使用服务器的语言环境设置转换日期,而不是浏览器。

是否有替代@Text(dateValue," D0S0")的浏览器区域设置?

3 个答案:

答案 0 :(得分:0)

最多" XPagey"这样做的方法是使用日期/时间转换器。例如(使用替换计算值):

<xp:viewColumn columnName="">
    <xp:this.value><![CDATA[#{javascript:
        new java.util.Date()
    }]]></xp:this.value>
    <xp:this.converter>
        <xp:convertDateTime type="both"/>
    </xp:this.converter>
</xp:viewColumn>

&#34; convertDateTime&#34;及其内置格式将尊重浏览器提供的区域设置。如果您在Xsp属性中设置选项以使用浏览器的时区和&#34;往返&#34;,它还应该尊重用户的时区。

答案 1 :(得分:0)

我已成功使用DateFormat.getDateInstance来解决这个问题。唯一的问题是它没有以与XPage日期转换器相同的格式返回短日期(没有前导零和2位数年份)。我已经绕过了这个,但是后面有一些摆弄着弦。

这是完整的功能:

function returnLocalShortDate(ndtDate) {
    // Receives NotesDateTime object, Java date or string; returns localised date string in XPages short date format
    importPackage(java.text);
    if (@IsText(ndtDate)) { // string
        var jsDate = @TextToTime(ndtDate);
    } else if (ndtDate instanceof Date) { // Java date
        var jsDate:Date = ndtDate;
    } else if (@IsTime(ndtDate)) { // Notes date/time
        var jsDate:Date = ndtDate[0].toJavaDate();      
    } else {
        return("");
    }
    var strDate:String = java.text.DateFormat.getDateInstance(DateFormat.SHORT, context.getLocale()).format(jsDate);
    var strYear = jsDate.getFullYear();
    var strDateArray = strDate.split("/");
    strDate = ('0' + strDateArray[0]).slice(-2) + '/' + ('0' + strDateArray[1]).slice(-2) + '/' + strYear;
    return(strDate);
}

答案 2 :(得分:0)

实际上,如果你知道你想要的格式,而不是用户可能想要的浏览器设置,你应该使用SimpleDateFormatter类。您可以根据the javadocs for that class所需的任何模式提供格式。如果提供NotesDocument对象和字段名称,则以dd-MMM-yyyy格式返回日期。

function getFormattedDate ( doc:NotesDocument, fieldName:String ) {
    importPackage(java.text);

    var dateFormatter:java.text.SimpleDateFormat = new SimpleDateFormat("dd-MMM-yyyy");
    var d:Date = new Date(@Today());

    if ( doc.hasItem (fieldName) ) {
        var valueVector:java.util.Vector = doc.getItemValueDateTimeArray(fieldName);
        var iterator = valueVector.iterator();

        while (iterator.hasNext()) {
            var itemvalue = iterator.next();
            if ((typeof(itemvalue)).endsWith("DateTime")) {
                d = new Date(itemvalue.toJavaDate());
                return dateFormatter.format(d);
            }
        }
    } else {
        return fieldName + " is not on the document"
    }
}

我非常感谢Declan Lynch的blog entry on date formatting,它需要一些调试,因为SSJS现在将日期值作为Vector返回。