不同时区的飞行时间

时间:2015-08-13 09:36:57

标签: xquery osb

我正面临时区问题。 代码:

{

let $ hour:= hours-from-duration(fn:subtract-dateTimes-yielding-dayTimeDuration(xs:dateTime(data($ FlightSegment / @ ArrivalDateTime)),xs:dateTime(data($ FlightSegment / @ DepartureDateTime)) )))             let $ min:= minutes-from-duration(fn:subtract-dateTimes-yielding-dayTimeDuration(xs:dateTime(data($ FlightSegment / @ ArrivalDateTime)),xs:dateTime(data($ FlightSegment / @ DepartureDateTime))))

返回

    if($hour < 10  and $min < 10) then
        <flt-seg:FlightDuration> {concat('0',$hour,':','0',$min)}</flt-seg:FlightDuration>
        else if ($min < 10 ) then 
         <flt-seg:FlightDuration> {concat($hour,':','0',$min)}</flt-seg:FlightDuration>
         else if ($hour < 10 ) then
          <flt-seg:FlightDuration> {concat('0',$hour,':',$min)}</flt-seg:FlightDuration>
         else
          <flt-seg:FlightDuration> {concat($hour,':',$min)}</flt-seg:FlightDuration>


    }

出发机场代码为:BNE(布里斯班)

抵达机场代码为:LAX(Lass angels)

我得到的回应:

DepartureDateTime:2015-08-15T09:50:00

ArrivalDateTime:2015-08-15T06:30:00

FlightDuration:0-3:0-20

飞行时间(0-3:0-20)我得到负值,所以请你帮我解决这个问题,我怎样才能获得正值。

你可以告诉我如何在不同时区获得适当的飞行时间。 在此先感谢。

1 个答案:

答案 0 :(得分:1)

看起来你有两个问题。

第一个问题是格式化持续时间,您可以使用functx:pad-integer-to-length()或使用bea date functions(或数字格式功能)进行格式化。这很容易。

您的第二个更难的问题是您的输入数据是机场本地的,无法按照您的方式进行比较。您需要从本地日期时间+端口IATA代码计算实际 UTC 日期时间,可能是通过临时查找,所以

  1. 机场 - &gt; timezone ID(可缓存)
  2. port-local dateTime + tzID - &gt; UTC dateTime。
  3. 它不一定是UTC;只要您在同一时区比较dateTimes。但是,UTC是一个方便的时区供选择,因此最好使用它。

    噢,是的。确保您的OSB JVM具有最新的tzdata,否则您会发现许多目的地的日期计算不准确 - 斐济喜欢在短时间内更改夏令时。