Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java在ColdFusion中转换时区,但可以';我没有新的时间_Java_Coldfusion_Timezone_Lucee - Fatal编程技术网

使用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);