我有一个简单的脚本
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”
答案 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);