使用Java转换ColdFusion中的时区,但无法获得新的时间

时间:2017-10-07 23:43:48

标签: java coldfusion timezone lucee

我有一个简单的脚本

sites[i]

如果查看输出,您会看到新日历包含正确的时区和时间,但如果我使用getTime(),则不会返回正确的值。我确信我已经做了一些事情,无论是在新日历中设置时间,还是甚至克隆,但我无法弄明白。

如果我将<cfscript> public string function convertTimeZone( string toTimeZone = "America/New_York" , date thisDate = now() ){ var azTimeZone = createObject("java", "java.util.TimeZone").getTimeZone(javaCast("string","US/Arizona")); var azCalendar = createObject("java", "java.util.GregorianCalendar" ).init(azTimeZone); azCalendar.set( javaCast( "int", year( arguments.thisDate ) ), javaCast( "int", (month( arguments.thisDate ) - 1) ), javaCast( "int", day( arguments.thisDate ) ), javaCast( "int", hour( arguments.thisDate ) ), javaCast( "int", minute( arguments.thisDate ) ), javaCast( "int", second( arguments.thisDate ) ) ); var newCal = azCalendar.clone(); newCal.setTimeInMillis(azCalendar.getTimeInMillis()); newCal.setTimeZone(javaCast("string",arguments.toTimeZone)); writeOutput('AZ Cal'); writeDump(azCalendar); writeDump(azCalendar.Timezone); writeDump(azCalendar.Time); writeDump(azCalendar.getTime()); writeOutput('New Cal'); writeDump(newCal); writeDump(newCal.Timezone); writeDump(newCal.Time); writeDump(newCal.getTime()); } convertTimeZone(); </cfscript> 添加到转储列表中,我会收到“America / New_York”

enter image description here

2 个答案:

答案 0 :(得分:1)

你可以“欺骗”ColdFusion使用时区调整的日期对象(因为java.util.Date无法识别时区)。

<cfscript>

    srcDate = createDateTime(2017, 10, 07, 16, 33, 37);
    srcTZ   = "US/Arizona";

    dstTZ   = "America/New_York";

    TimeZone = createObject("java", "java.util.TimeZone");
    srcTZinfo = TimeZone.getTimeZone(srcTZ);
    dstTZinfo = TimeZone.getTimeZone(dstTZ);

    srcOffset = (srcTZinfo.getRawOffset() / 1000);
    dstOffset = (dstTZinfo.getRawOffset() / 1000);

    srcDSToffset = (srcTZinfo.getDSTSavings() / 1000);
    dstDSToffset = (dstTZinfo.getDSTSavings() / 1000);

    src2utc = dateAdd("s", -(srcOffset + srcDSToffset), srcDate);
    utc2dst = dateAdd("s",  (dstOffset + dstDSToffset), src2utc);

</cfscript>

<cfdump label="#srcTZ#" var="#srcDate#">
<cfdump label="#dstTZ#" var="#utc2dst#">

该代码段使用指定的时区srcDate将源日期对象srcTZ转换为UTC日期。然后将UTC日期调整为所需的时区dstTZ,并将最终日期对象放入utc2dst

答案 1 :(得分:0)

实际上没有包含正确的时间。转储中的演示文稿看起来就是这样。 WriteDump()在显示日历对象时必须施加额外的魔力。

由于newCal的创建方式,日期值不会更改。不是克隆azCalendar,而是创建新实例并将azCalendar时间应用于set(...)。然后日期值将改变。但是我不确定它是否适用于任意时区,只有jvm默认

据说Java 8+已经改进了日期选项,值得研究。对于早期版本,我使用了SimpleDateFormat trick。创建两个格式化程序。一个使用原始时区解析输入。另一种使用所需时区格式化输出。然后使用parseDateTime()将最终字符串转换回日期对象。

thisDate = now();
fromTimeZone = "America/Phoenix";
toTimeZone = "America/New_York";

dateMask = "yyyy-MM-dd HH:mm:ss";
timeZone = createObject("java", "java.util.TimeZone");

fromFormat = createObject("java", "java.text.SimpleDateFormat").init(dateMask);
fromFormat.setTimeZone(timeZone.getTimeZone(fromTimeZone));
// parse input as date string
dateString = dateTimeFormat(thisDate, "yyyy-MM-dd HH:nn:ss");
fromDate = fromFormat.parse(dateString); 

// format output as date string
toFormat = createObject("java", "java.text.SimpleDateFormat").init(dateMask);
toFormat.setTimeZone(timeZone.getTimeZone(toTimeZone));

// convert back into date
toDate = parseDateTime(toFormat.format(fromDate));
writeDump(toDate);