使用Java在ColdFusion中转换时区,但可以';我没有新的时间
我有一个简单的脚本使用Java在ColdFusion中转换时区,但可以';我没有新的时间,java,coldfusion,timezone,lucee,Java,Coldfusion,Timezone,Lucee,我有一个简单的脚本 <cfscript> public string function convertTimeZone( string toTimeZone = "America/New_York" , date thisDate = now() ){ var azTimeZone = createObject("java", "java.util.TimeZone").getTimeZone(javaCast("string","US/Arizon
<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>
公共字符串函数convertTimeZone(
字符串toTimeZone=“美国/纽约”
,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”,年份(arguments.thisDate)),
javaCast(“int”,(月(arguments.thisDate)-1)),
javaCast(“int”,day(arguments.thisDate)),
javaCast(“int”,小时(arguments.thisDate)),
javaCast(“int”,分钟(arguments.thisDate)),
javaCast(“int”,第二个(arguments.thisDate))
);
var newCal=azCalendar.clone();
newCal.setTimeInMillis(azCalendar.getTimeInMillis());
setTimeZone(javaCast(“string”,arguments.toTimeZone));
写输出(“AZ-Cal”);
书面文件(日历);
writeDump(azCalendar.Timezone);
writeDump(azCalendar.Time);
writeDump(azCalendar.getTime());
写输出(“新Cal”);
writeDump(newCal);
writeDump(新校准时区);
writeDump(新校准时间);
writeDump(newCal.getTime());
}
转换时区();
如果查看输出,您将看到新日历包含正确的时区和时间,但如果使用getTime(),它将不会返回正确的值。我确信我在设置新日历的时间,甚至是克隆日历上都做了些什么,但我不太清楚
如果我添加writeDump(newCal.getTimezone())代码>在垃圾堆列表中,我得到了“美国/纽约”
您可以“欺骗”ColdFusion使用时区调整日期对象(因为java.util.date
不能感知时区)
srcDate=createDateTime(2017,10,07,16,33,37);
srcTZ=“美国/亚利桑那州”;
dstTZ=“美国/纽约”;
TimeZone=createObject(“java”、“java.util.TimeZone”);
srcTZinfo=TimeZone.getTimeZone(srcTZ);
dstTZinfo=时区。getTimeZone(dstTZ);
srcOffset=(srcTZinfo.getRawOffset()/1000);
dstOffset=(dstzinfo.getRawOffset()/1000);
srcDSToffset=(srcTZinfo.getdstssavings()/1000);
dstOffset=(dstzinfo.getdstssavings()/1000);
src2utc=dateAdd(“s”,-(srcdoffset+srcDSToffset),srcDate);
utc2dst=dateAdd(“s”,(dstOffset+dstOffset),src2utc);
代码段使用指定的时区将源日期对象srcDate
转换为UTC日期。然后将UTC日期调整到所需的时区DSTZ
,并将最终日期对象放入utc2dst
中,实际上它不包含正确的时间。转储中的演示只是让它看起来像那样WriteDump()
在显示日历对象时必须应用额外的魔法
日期值不会因newCal
的创建方式而更改。不要克隆azCalendar
,而是创建一个新实例,并使用set(…)
应用azCalendar
时间。然后日期值将更改。但是,我不确定它是否能在任意时区正常工作,只有jvm默认值
据说Java8+改进了日期选项,值得研究。对于早期版本,我使用了。创建两个格式化程序。一个是使用原始时区解析输入。另一种方法是使用所需时区格式化输出。然后使用parseDateTime()将最终字符串转换回日期对象
我认为您正在体验解释的内容和。您是否查看了timezone.cfc库?它有很多功能,使您能够根据92个不同的US/CA时区识别DST和偏移量。谢谢Alex,我试图避免整个偏移量计算。我现在更感兴趣的是为什么我可以将正确的时间输入newCal
对象,但似乎无法将其从对象中取出,因为时间是作为UTC的偏移量返回的,即不知道时区。这只是Java旧的日期/时间类的一个问题,Java 8(Java.time
)解决了这个问题。您必须添加所需时区的偏移量。您可以使用ColdFusion立即获取UTC。
<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#">
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);