使用XQuery将日期输入转换为特定格式的String值

时间:2014-06-23 11:24:27

标签: xquery

我必须使用xquery以DDMMYYYY格式创建日期字符串。输入到我的xquery的日期将类似于" 2004-05-02T00:00:00 + 01:00"。截至目前,我正在使用以下解决方案来获取所需的fromat(02052004),

$dateString:= concat(substring($dateInput, 9, 2), substring($dateInput, 6, 2), substring($dateInput, 1, 4));

是否有其他方法或内置函数可用于将日期转换为所需的字符串格式?

4 个答案:

答案 0 :(得分:3)

如果您可以访问 XQuery 3.0 ,则可以利用format-dateTime($date, $picture)

let $date := xs:dateTime("2004-05-02T00:00:00+01:00")
return format-dateTime($date, "[D,2][M,2][Y,4]")

如果您还没有(仅 XQuery 1.0 ),您仍然可以使用更具语义的版本。由于它也没有format-number(...)功能,我使用了functx中的一些准备好的函数:

declare namespace functx = "http://www.functx.com";
declare function functx:pad-integer-to-length
  ( $integerToPad as xs:anyAtomicType? ,
    $length as xs:integer )  as xs:string {

   if ($length < string-length(string($integerToPad)))
   then error(xs:QName('functx:Integer_Longer_Than_Length'))
   else concat
         (functx:repeat-string(
            '0',$length - string-length(string($integerToPad))),
          string($integerToPad))
 } ;

 declare function functx:repeat-string
  ( $stringToRepeat as xs:string? ,
    $count as xs:integer )  as xs:string {

   string-join((for $i in 1 to $count return $stringToRepeat),
                        '')
 } ;

let $date := xs:dateTime("2004-05-02T00:00:00+01:00")
let $date := xs:date($date)
return string-join((
  functx:pad-integer-to-length(day-from-date($date), 2),
  functx:pad-integer-to-length(month-from-date($date), 2),
  functx:pad-integer-to-length(year-from-date($date), 4)
))

如果你喜欢更笨重但语义版本或简单的字符串操作,请自行决定。请注意,时区可能会导致不同的结果,具体取决于您选择的结果。

答案 1 :(得分:1)

如果您使用的是XQuery 1.0处理器,那将非常复杂。有fn:day-from-dateTime()这样的函数可用,但是对于10以下的数字,会返回一个数字,这很可能不是你想要的。

你可以写一个简单的填充函数

declare function local:pad($number as xs:integer) as xs:string
{
  if ($number<10)
  then concat("0", $number)
  else xs:string($number)
};

并用它来构建日期

concat(
  local:pad(day-from-dateTime(xs:dateTime($dateInput))),
  local:pad(month-from-dateTime(xs:dateTime($dateInput))),
  year-from-dateTime(xs:dateTime($dateInput))
)

如果您的处理器支持XQuery 3.0,fn:format-dateTime()可用,并允许更轻松的格式化。格式规则位于http://www.w3.org/TR/2014/REC-xpath-functions-30-20140408/#rules-for-datetime-formatting。对于您想要的输出,以下内容应该有效:

fn:format-dateTime(xs:dateTime($dateInput),"[D01][M01][Y}")

答案 2 :(得分:0)

您可以尝试以下方法:

FN:格式日期时间(XS:日期时间($ dateInput)&#34; [M01] [D01] [Y0001]&#34)

生产02052004

答案 3 :(得分:0)

您可以参考此网站-http://www.xqueryfunctions.com/xq/functx_mmddyyyy-to-date.html。刚刚对函数的最后一行进行了更改-$ 3- $ 2- $ 1

declare namespace functx = "http://www.functx.com";
declare function functx:mmddyyyy-to-date
       ( $dateString as xs:string? )  as xs:date? {

       if (empty($dateString))
       then ()
       else if (not(matches($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$')))
       then error(xs:QName('functx:Invalid_Date_Format'))
       else xs:date(replace($dateString,
                    '^\D*(\d{2})\D*(\d{2})\D*(\d{4})\D*$',
                    '$3-$2-$1'))
       } ;

用法:

functx:mmddyyyy-to-date('31-01-2004')

输出

2004-01-31