書き始めたばかり…。書いては書き直し、今回もいつものパターンか?

事務所と違う場所は、光回線となりました。
リモート操作も出来るようになったのに、コピペができないことに気づく。
なので、ここを経由。

力尽きて眠ろうとしたときに、ローマ数字の変換を妄想しようかどうか悩む。
[YW] で元号年もあったらいいなぁと。

<DOCTYPE html>
<title>XSLT 2.0 の format-date() を実装</title>

<style>
table, th, td {
  border : 2px #a88 ridge;
}
th {
  background : #b99;
}
</style>

<body>
<table>
  <thead>
    <tr>
      <th align="left">Required Output</th>
      <th align="left">Expression</th>
    
  </thead>
  <tbody>
    <tr>
      <td><code>2002-12-31</code>
      <td><code>"[Y0001]-[M01]-[D01]"</code>
    <tr>
      <td><code>12-31-2002</code>
      <td><code>"[M]-[D]-[Y]"</code>

    <tr>
      <td><code>31-12-2002</code>
      <td><code>"[D]-[M]-[Y]"</code>
    
    <tr>
      <td><code>31 XII 2002</code>
      <td><code>"[D1] [MI] [Y]"</code>
    
    <tr>
      <td><code>31st December, 2002</code>
      <td><code>"[D1o] [MNn], [Y]", "en"</code>
    
    <tr>
      <td><code>31 DEC 2002</code>
      <td><code>"[D01] [MN,*-3] [Y0001]", "en"</code>
    
    <tr>
      <td><code>December 31, 2002</code>
      <td><code>"[MNn] [D], [Y]", "en"</code>
    
    <tr>
      <td><code>31 Dezember, 2002</code>
      <td><code>"[D] [MNn], [Y]", "de"</code>
    
    <tr>
      <td><code>Tisdag 31 December 2002</code>
      <td><code>"[FNn] [D] [MNn] [Y]", "sv"</code>
    
    <tr>
      <td><code>[2002-12-31]</code>
      <td><code>"[[[Y0001]-[M01]-[D01]]]"</code>
    
    <tr>
      <td><code>Two Thousand and Three</code>
      <td><code>"[YWw]", "en"</code>
    
    <tr>
      <td><code>einunddrei?igste Dezember</code>
      <td><code>"[Dwo] [MNn]", "de"</code>
    
    <tr>
      <td><code>3:58 PM</code>
      <td><code>"[h]:[m01] [PN]", "en"</code>
    
    <tr>
      <td><code>3:58:45 pm</code>
      <td><code>"[h]:[m01]:[s01] [Pn]", "en"</code>
    
    <tr>
      <td><code>3:58:45 PM PDT</code>
      <td><code>"[h]:[m01]:[s01] [PN] [ZN,*-3]", "en"</code>
    
    <tr>
      <td><code>3:58:45 o'clock PM PDT</code>
      <td><code>"[h]:[m01]:[s01] o'clock [PN] [ZN,*-3]", "en"</code>
    
    <tr>
      <td><code>15:58</code>
      <td>
      <code>"[H01]:[m01]"</code>
    
    <tr>
      <td><code>15:58:45.762</code>
      <td>
      <code>"[H01]:[m01]:[s01].[f001]"</code>
    
    <tr>
      <td><code>15:58:45 GMT+02:00</code>
      <td><code>"[H01]:[m01]:[s01] [z]", "en"</code>
    
    <tr>
      <td><code>15.58 Uhr GMT+02:00</code>
      <td><code>"[H01]:[m01] Uhr [z]", "de"</code>
    
    <tr>
      <td><code>3.58pm on Tuesday, 31st
      December</code>
      <td><code>"[h].[m01][Pn] on [FNn], [D1o] [MNn]"</code>
    
    <tr>
      <td><span><code>12/31/2002 at 15:58:45</code></span>
      <td><code>"[M01]/[D01]/[Y0001] at [H01]:[m01]:[s01]"</code>
  </tbody>
</table>


<script>

(function () {
  var n = 1; // 全て小文字
  var N = 2; // 全て大文字
  var Nn = 0; // 先頭だけ大文字
  
  var NUM  = 0; // 数字で
  var NAME = 1; // 名前で
  
  var week_name =
    ['Sunday', 'Monday', 'Tuesday', 'Wednesday',
     'Thursday', 'Friday', 'Saturday'];
    
  var month_name =
    [ 'January', 'February', 'March', 'April', 'May', 'June',
      'July', 'August', 'September', 'October', 'November', 'December'];
  
  var roman =
    [ ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
      ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
      ['C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
      ['M', 'MM', 'MMM' ] ];
  
  var defaultTable = {
    Y: { func: getYear,   type: NUM,  opt: { zsup: true,  width: 0 } },
    M: { func: getMonth,  type: NUM,  opt: { zsup: true,  width: 0 } },
    D: { func: getDay  ,  type: NUM,  opt: { zsup: true,  width: 0 } },
    d: { func: getDayYr,  type: NUM,  opt: { zsup: true,  width: 0 } },
    F: { func: getDayWk,  type: NAME, opt: { format: n,   width: 0 } },
    W: { func: getWeekYr, type: NUM,  opt: { zsup: true,  width: 0 } },
    w: { func: getWeekMt, type: NUM,  opt: { zsup: true,  width: 0 } },
    H: { func: getHour24, type: NUM,  opt: { zsup: true,  width: 0 } },
    h: { func: getHour12, type: NUM,  opt: { zsup: true,  width: 0 } },
    P: { func: getWeekYr, type: NAME, opt: { format: n,   width: 0 } },
    m: { func: getMinute, type: NUM,  opt: { zsup: false, width: 2 } },
    s: { func: getSecond, type: NUM,  opt: { zsup: false, width: 2 } },
    f: { func: getMillsd, type: NUM,  opt: { zsup: true,  width: 0 } }/*,
    Z: { func: getTMZone, type: NUM,  opt: { zsup: true,  width: 0 } },
    z: { func: getTMZone, type: NUM,  opt: { zsup: true,  width: 0 } },
    C: { func: getCalendar, type: NUM,  opt: { format: n,   width: 0 } },
    E: { func: getTMZone, type: NUM,  opt: { format: n,   width: 0 } }*/
  };
  
  var HASH = defaultTable;
  
  
  function createObject (arg, args) {
    var Func = new Function;
    var result;
    
    Func.prototype = arg;
    result = new Func;
    
    if (args)
      defineProperties.call (result, arg);

    return result;
  }


  function defineProperties (args) {
    for (var n in args)
      if (args.hasOwnProperty (n))
        this[n] = args[n];
  }
    
  
  function formatDuration (dateTime, format) {
    if (0 === arguments.length || (! format))
      return null;
    
    var result = [];
    var picture = format.split (''); // 1文字ずつ分解
    var state = 0;
    var index = 0;
    var c;
    var arg = { };
    
    while ((c = picture[index++])) {
      switch (state) {
      case 0 :
        
        if (c === '[') { // "[" の始まり
          state = 1;
        }
        else {
          result.push (c);
        }
        break;
      
      case 1:
        if ('[' === c) { // "[[" を "[" に
          state = 0;
          result.push (c);
        }
        else if ((arg = HASH[c])) { // テーブルに登録されたものか?
          arg = createObject (new Object, arg);
          state = 2;
        }
        else {
          throw new Error ('Syntax Error!!');
        }
        break;
      
      case 2 :
        switch (c) {
        case '0' :
          arg.type = NUM;
          arg.opt.zsup = false;
          arg.opt.width += 1;
          break;
        }

        case '1' :
          arg.type = NUM;
          arg.opt.zsup = false;
          arg.opt.width += 1;
          state = 3;
          break;
        
        case 'i' :
          arg.type = NAME;
          state = 3;
          break;

        case 'I' :
          state = 3;
          break;

        case 'W' :
          state = 3;
          break;
          
        case 'w' :
          state = 3;
          break;
        
        break;
      }
    }
    
    
  }

  this.formatDuration = formatDuration;
})();
</script>

<pre style="display:none">
16.5の書式の日付と時刻

三つの機能は選択されたカレンダー、言語、および国の規則を使用して、文字列として日付と時刻を表現するために提供されています。それぞれには2つのバリアントがあります。
XSのような形式- dateTimeを($値:dateTimeを、?
XSとして$画像:文字列、
XSとして$言語:文字列、?
XSとして$カレンダー:文字列、?
をxs:stringなどの文字列):$ XSのような国?
をxs:stringのような形式- dateTimeを(文字列XSとして$値::dateTimeの、通常のような$絵?)?
XSのような形式 - 日付($値:日付、?
XSとして$画像:文字列、
XSとして$言語:文字列、?
XSとして$カレンダー:文字列、?
をxs:stringなどの文字列):$ XSのような国?
をxs:stringのような形式 - 日付(文字列XSとして$値::日付、XSのような$絵?)?
XSのような形式 - 時間($値:時間、?
XSとして$画像:文字列、
XSとして$言語:文字列、?
XSとして$カレンダー:文字列、?
をxs:stringなどの文字列):$ XSのような国?
フォーマット時間(通常は$値:時間、通常のような$画像:?文字列):文字列XSとして?

$画像の引数、$カレンダーの引数で指定されたカレンダー、$言語の引数で指定された言語で指定された画像の文字列を使用して文字列としてフォーマット- dateTimeを、フォーマットの日付、およびフォーマット時関数形式$値、および$国の引数で指定された国。関数の結果は、指定されたDateTime、日付、または時刻値の書式化文字列表現です。

[定義:三つの関数形式 - 日付、フォーマット時間、およびフォーマット- dateTimeには、日付の書式設定関数と総称されています。]

$ valueが空のシーケンスである場合、空のシーケンスが返されます。

3つの関数のそれぞれの引数が2つのフォームを呼び出すと、空のシーケンスに設定された最後の3つの引数の各々との5引数のフォームを呼び出すことと等価です。

言語、カレンダー、および国の引数の詳細については、16.5.2言語、カレンダー、および国別の引数を参照してください。

一般的に、無効な画像、言語、カレンダー、または国の引数の使用は回復不能な動的エラーとして分類されます。これとは対照的に、実装でサポートされていない有効なされていますが、これらの引数のいずれかのオプションを使用すると、エラーではありません、そしてこのような場合には実装は、フォールバック表現の値を出力するために必要です。
16.5.1画像の文字列

画像は、変数マーカーとリテラル部分文字列のシーケンスで構成されています。角括弧で囲まれた部分文字列を変数マーカーとして解釈されます。角括弧で囲まれていない部分文字列はリテラル部分文字列として扱われます。リテラル部分文字列はオプションであり、存在する場合することは空白も含め、変更されずにレンダリングされます。開いたり閉じ角括弧がリテラル文字列内で必要な場合は、それを二重化しなければなりません。変数マーカーは、日付および/またはフォーマットする時の側面を表す文字列によって結果に置き換えられます。これらは以下で詳細に説明されています。

変数マーカーは、指定子が1つまたは2つのプレゼンテーションの修飾子によっておよび/または任意の幅の修飾子によって、オプションに続くコンポーネントで構成されています。変数マーカー内の空白は無視されます。

コンポーネントの指定子が必要とされる日付または時刻のコンポーネントを示し、次の値をとります。
指定子の意味デフォルトのプレゼンテーションの修飾
Y年(絶対値)1
1年目のM月
月1のDの一日
年1 d日
F週の日n
1年目でW週
月1でw年における週
一日のHの時間(24時間)1
半日でh時間(12時間)1
P午前/午後のマーカーN
時間01 m分
分01秒秒
fは小数秒1
ZのUTCからのオフセット時間とタイムゾーン、またはアルファベット修飾子が存在するタイムゾーンの従来の名前(たとえば、PSTなど)が1の場合
例えば、GMT GMT +1 1を使用して時間オフセットとしてのzタイムゾーン
Cカレンダー:カレンダー名の名前または省略形のn
Eの時代:年の番号付けのためのベースラインの名前、たとえば君主nの治世

[はXTDE1340のERR]絵の構文に誤りがある場合には、回復不可能な動的なエラーです。

[はXTDE1350のERR]画像内のコンポーネントの指定子は、フォーマット時に供給された画像は、年を参照している場合例えば、$値の特定のタイプで使用できないコンポーネントを参照する場合には、回復不可能な動的エラーであり、月、または日の成分。

それは、指定された値がタイムゾーン情報を持たないときにタイムゾーンのコンポーネントを含めるようにエラーではありません。このような状況ではタイムゾーンコンポーネントは無視されます。

最初のプレゼンテーションの修飾子は、コンポーネントの値が表されることになっているスタイルを示します。その値は次のいずれかになります。

    XSLのフォーマット文字列で許可されている任意の形式のトークン:コンポーネントの値が数値出力指定された数値の表示形式(たとえば、1、01、私、私、wを用いてなることを示す数値の命令(12番号を参照)、 、W、またはWW)または

    フォーマットトークンN、N、またはNN、コンポーネントの値は、それぞれ小文字、大文字、またはタイトルの場合には、名前によって出力されることを示している。名前で出力できるコンポーネントは、(これらに限定されない)ヶ月、曜日、タイムゾーン、および時代などがあります。プロセッサが選択されたカレンダーと言語の名前でこれらのコンポーネントを出力できない場合は、それは実装定義のフォールバックの表現を使用する必要があります。

実装が要求された形式のトークンの使用をサポートしていない場合、それは、そのコンポーネントに対してデフォルトのプレゼンテーションの修飾子を使用する必要があります。

最初のプレゼンテーションの修飾子が存在する場合、それは必要に応じて次のように目のプレゼンテーションの修飾子が続くことがあります。
修飾子の意味
トン従来のナンバリング。番号:これは、XSLのように文字値="伝統"と同じ意味を持ちます。
例えば第八または8℃の番号のO序フォーム、。数字の序数形式の実際の表現は、言語上だけでなく、文法的なコンテキスト(例えば、いくつかの言語では、性別に同意する必要があります)にだけ依存することがあります。

注:

書式のルールはXSLにトークン形式の規則の用語で表現されていますが:数、実際に使用されるフォーマットは、日付コンポーネント適切な場所の番号付けに特化することができます。例えば、イタリア語で、それが月の初日の序数(プリモ)を使用する従来型であり、残りの日のための基数(原因、TRE、クワトロ...)。プロセッサは、したがって、序プレゼンテーションの修飾子の有無を無視して、月の数日にこの規則を使用することができます。

プレゼンテーションの修飾子が含まれているかどうかに関係なく、幅の修飾子が与えられるかもしれない。これは、値の表現に含まれる文字または数字の数を示します。

幅の修飾子は、存在する場合は、カンマで導入されている。それは次の形式をとります。

   、最小幅(" - "のmax - width)?

最小幅は、出力、または明示的な最小値が存在しないことを示す*にする文字の最小数を示す符号なし整数であり、およびmax - widthはどちらに出力する文字の最大数を示す符号なし整数であり、または*ここで、のmax - widthが省略されている場合、*が想定され、明示的な最大数が設定されていないことを示していない。両方の整数は、存在する場合は、ゼロより大きくなければなりません。

001のような先頭のゼロを、、を含む形式のトークン形式トークンに表示される桁数の最小値と最大幅を設定し、幅の修飾子も存在している場合は、幅の修飾子が優先されます。

注:

1など、独自の上の1桁で構成されるフォーマットトークンは、出力の桁数を制限しません。特に、小数秒の場合には、[F001]リクエスト3桁、[F01]リクエスト二桁が、[F1]は実装定義の桁数を生成します。ちょうど1つの数字が必要な場合は、このは、コンポーネント指定子[F1 ,1 - 1]を使用して達成することができます。

minumumと最大の幅が指定されていない場合、出力は次のように多くの文字として使用していますとして切り捨てることなく、パディングなしのコンポーネントの値を表現するために必要とされています:これは、値の完全な表現として、以下に呼ばれています。

値の完全な表現が指定された最大幅を超えた場合、プロセッサは最大幅に収まる別の短い表現を使用しようとしてください。プレゼンテーションの修飾子は、N、N、またはnnです、これがない場合、名前の省略可能な場合、従来の略語のいずれかを使用して、または右切り捨て原油によって行われます。それは、これは従来使用されている場合、3文字の略語を使用することは可能でしょうが例えば、4のmax - widthを設定すると、4文字の略語を使用することを示します。 (例えば、"火曜日""火"、そして"金""金曜日"と略すことがあります。)今年のコンポーネントの場合には、昨年から上位の桁の最大幅要求の省略を設定し、例えば、 、のmax - widthが2に設定されているならば、2003年には03として出力されます。小数秒のコンポーネントの場合には、値が関数のラウンド半からも(フラクショナル秒、最大幅)を適用することにより、指定されたサイズかのように丸められます。機構が指定した最大幅(例えば、ローマ数字が使用されている場合)内の値を当てはめるために利用可能でない場合、値はその完全な表現で出力されるはずです。

値の完全な表現に指定された最小幅よりも短い場合、プロセッサはパッド、指定された幅まで値をすべき。数字の10進数表現では、これは数字の文字の適切なセットからゼロの数字を先頭に追加、または秒の小数のコンポーネントの場合にはゼロの数字を付加することによって行われる必要があります。他のケースでは、それは付加スペースで行われる必要があります。
16.5.2言語、カレンダー、および国別の引数

日付の書式設定関数でサポートされる言語、カレンダー、および国のセットは、実装定義です。これらの引数のいずれかが省略または空のシーケンスであるされている場合、実装で定義されたデフォルト値が使用されます。

フォールバックの表現が要求されたものとは異なるカレンダーを使用している場合、出力文字列が接頭辞として付ける必要があります[カレンダー:X] Xが実際に使用されるカレンダーを識別します。文字列のカレンダーを利用できる場合は、要求された言語を使用してローカライズする必要があります。 Yが実際に使用される言語を識別:フォールバックの表現が要求された言語と異なる言語を使用している場合、出力文字列は、[Y言語]を付ける必要があります。文字列の言語は、実装に依存する方法でローカライズされることがあります。値の特定のコンポーネントは、要求された形式で出力できない場合は、そのコンポーネントのデフォルトの形式で出力する必要があります。

言語の引数は、関数の結果の文字列に使用する言語を指定します。 lang属性([XML]を参照してください):引数の値が空のシーケンスまたはXMLで有効となる値のいずれかである必要があります。これは国別コードに基づいて、サブ言語の識別([ISO 3166-1]から)だけでなく、方言の、国内の領域の同定を可能にすることに注意してください。

言語の引数を省略した場合、または空のシーケンスに設定されている、またはそれが無効な値または実装が認識しない値に設定されている場合場合、プロセッサは実装定義言語を使用しています。

言語は、適切な言語に依存するフォームを選択するために使用されます。

    (例えば、数ヶ月の)名前
    数字は、単語としてまたは序数(20、20、二十世紀など)で表す
    時間制(0〜23対1から24まで、0から11対1〜12)
    週の最初の日、年の最初の週

これは言語または言語の引数の一部として指定されている任意の副言語を上書きするために使用すべきではないものの、必要に応じてこれを選択することも、考慮に国の引数の値がかかることがあります。

任意の言語で使用されている名称および略称の選択は、実装定義です。別のJLY使用例えば、ある実装は07月、7月の省略形があります。ドイツでは、ある実装では、別の用途がSonnabendながら、Samstagとして土曜日を表すことがあります。実装は、ユーザーがそのような選択を制御することができます機構を提供することがあります。

序数値を使用する場合には、序の正確な表現(例えば、言語的性別)の選択は、コンポーネントがフォーマットされているのと画像の文字列でのテキストコンテキストに依存する場合があります。

カレンダーの属性は、$ value引数で指定されたDateTime、日付、または時刻を指定した暦の値に変換し、そのカレンダーの規則を使用して文字列に変換する必要があることを指定します。

カレンダーの値は、有効なQNameである必要があります。 QNameが接頭辞を持たない場合、それは以下に指定された指定子でカレンダーを識別します。 QNameにプレフィックスがある場合5.1修飾名で説明されているように、それをQNameは、展開- QNameに展開され、拡張された- QNameは、カレンダーを識別し、この場合の動作は実装定義です。

カレンダの属性が省略されている場合、実装定義の値が使用されます。

注:

以下に記載されているカレンダーは、過去100年間使われることが知られていた。他の多くのカレンダーは、過去に使用されている。

この仕様では、これらのカレンダーのいずれかを定義し、またかれらがxsの値空間にマップする方法はありません:[XMLスキーマ第2部]で日付のデータ型。日付が異なるカレンダーを使用して記録されている曖昧さがあるかもしれません。例えば、新しい一日の始まり、さまざまな暦では同時ではない、とでも(例えば、日の出や日没の時間に基づいて)地理的に異なる場合があります。一日の時間も知られている、そして地理的な位置がわかっているときときに日付の翻訳は、したがって、より信頼性が高くなります。一つのカレンダーと、別の間の日付を変換する場合、プロセッサは優先して国の引数を使用して、国および/または言語の引数の値を考慮することがあります。

それらの間の変換のためのこれらのカレンダーの一部に関する情報、およびアルゴリズムは、[暦計算]で見つけられるかもしれません。
デジグネータカレンダー
AD西暦(キリスト紀元)
AHアンノーヘジラ(Muhammedan時代)
AME Mauludi時代(モハメッドの誕生以来、太陽歳)
AM世界紀元(ユダヤ暦)
AP安野Persici
味坂時代(Javaの)AS
仏教の時代と
CBクッチベハール時代
CE西暦
CL中国の旧時代
CSチュラSakarat時代
EEエチオピアの時代
FE Fasli時代
ISO ISO 8601カレンダー
JE日本語カレンダー
KEカルサ時代(シーク教徒のカレンダー)
KYはユガのカーリー
MEマラバルの時代
MS君主の太陽の時代
NSネパールSamwat時代
OSオールドスタイル(ユリウス暦)
RSラタナコーシン(バンコク)時代
SE坂時代
SHモハッソーラー時代(イラン)
SS坂Samvat
TE Tripurabda時代
Vikrama時代のVEの使い方
VS Vikrama Samvat時代

上記のカレンダーを1つ以上サポートする必要があります。それはカレンダーがサポートされている実装定義である。

上記のリストに含まれていると、ISOが指定されているISO 8601カレンダー([ISO 8601])は、グレゴリオ暦指定されたADに非常によく似ていますが、それはいくつかの方法で異なります。 ISOカレンダーは、その日付と時刻の書式は、他のソフトウェアで容易に読み取ることができるように意図だけでなく、人間のユーザーにとって読みやすくされています。 ISOカレンダーは、ISO 8601で定義されている特定の番号付けの規則を使用するのではなく、これらを単位言語ごとにローカライズできるようにすることを規定しています。特に、それは週に毎年、年の週、日で日付を識別する数値"週の日付"の書式を提供し、ISOのカレンダーで曜日は、1(月曜日)から7(日曜日)に番号が付けられています任意の暦年の第1週はその年の最初の木曜日を含む週(月曜日から日曜日まで)です。値が日付と[XMLスキーマ第2部]で定義されている時間の字句表現で使用されているコンポーネントの年、月、日、時、分、秒の数値は、ISOのカレンダーに同じです。このカレンダーで時代は("E"コンポーネント)のどちらかマイナス記号(負の年の場合)または長さゼロの文字列(正年間)です。 1月1日、AD 1日より前の日付の場合は、ISOとADのカレンダーの年の数字は、それぞれ他のから1つオフになっています:ISO年間0000 1 BCであり、-0001等、2 BCです。

注:

XMLスキーマで定義されるように日付と時刻のデータ型の値空間は、時間の絶対的なポイントに基づいています。これらのデータ型の字句空間は、過去と未来に外挿する近代西洋暦である早期に起こるグレゴリオ暦を使用して、時間内にこれらの絶対的な点の表現を定義しますが、値空間は、カレンダーに中立です。日付の書式設定関数は、この絶対的な時点での表現を生成しますが、おそらく別のカレンダーに示さ。したがって、たとえば、その字句表現のXMLスキーマの日付は1502年1月11日(ローマ教皇グレゴリウス13世が誕生された日)であると、1502年1月1日にオールドスタイル(ユリウス)暦を使用してフォーマットされる可能性があります。これは、2つのカレンダーの間に10日間の差がその時点で存在するという事実を反映している。これは、日付が、現代の文書に記録された方法を反映していても、1502年1月1日などの日付:それは正しくないだろう、と誤った結果を生むだろう、型xsの要素または属性にこの日付を表す。

古代に発生年を参照するときは、現代の歴史家は一般に0年(1 CEは、そのため、1 BCEになる前に年が)存在しないのナンバリングシステムを使用してください。これは、要求されたカレンダーは、OS(ジュリアン)またはAD(グレゴリオ暦)である場合に使用されるべき規則です。要求されたカレンダーがISOの場合は、しかし、ISO 8601の規則に従ってください:ここで0001の前に今年はゼロ番号が付けられています。の[XMLスキーマ第2部](バージョン1.0)、通常の値空間:日付およびxs:dateTimeは、年のゼロは含まれません。しかし、将来の版は、ISO 8601規則を承認することを期待されています。これは、ジュリアスシーザーが暗殺された日付はISO 8601字句表現-0043-03-13を持っていることを意味しますが、ユリウス暦では3月15日44 BCEまたは上のグレゴリオ暦(依存で3月13日44 BCEとしてフォーマットされますヶ月と時代の名前)の選ばれた局在。

国の引数の使用目的では、dateTime、日付、または時間によって表されるイベントは、$ value引数で指定された場所を特定することです行われたか行われます。値が指定され、空のシーケンスでない場合、それは[ISO 3166-1]で定義されている国コードでなければなりません。また、実装は、ISO 3166から3から国のかつて使用されている名前を表すISO 3166-2から国の下位区分、またはコードを表すコードの使用が許可される場合があります。この引数は、日付または時刻をフォーマットされるユーザーの位置を特定することを意図されていない、言語属性によって行ってください。この情報は、カレンダーや時にどのように個々のコンポーネントの日付と時刻の書式化するかどうかを決定する際の間の日付を変換するときに追加情報を提供するために使用されることがあります。例えば、オールドスタイル(ジュリアン)を使用して別の国では、カレンダーは別の日に新しい年に開始、および一部の国では、計算、うるう年の違いの結果として、同期が取れていたカレンダーの亜種を使用。彼らはフォーマットする日付、または将来の日付の現在の境界の時点で存在していた国コードによって識別される地理的領域は、境界によって定義されます。
日付と時刻の書式の16.5.3例
例:グレゴリオ暦

次の例は、日付と時間の選択と、それらがフォーマットされるかもしれない方法を示しています。これらの例は、デフォルトのカレンダーとしてグレゴリオ暦の使用を前提としています。
必要な出力式
2002年12月31日フォーマット - 日付($ D、"[Y0001] - [M01] - [D01]")
2002年12月31日フォーマット - 日付($ D、"[M] - [D] - [Y]")
31-12-2002形式 - 日付($ D、"[D] - [M] - [Y]")
31 XII 2002フォーマットの日付($ D、"[D1] [MI] [Y]")
2002年12月31日フォーマット - 日付($ D、"[D1o] [MNN]、[Y]""EN"、()、())
31 DEC 2002フォーマットの日付($ D、"[D01] [MN、*- 3] [Y0001]""EN"、()、())
2002年12月31日フォーマット - 日付($ D、"[MNN] [D]、[Y]""EN"、()、())
31 Dezember 2002フォーマットの日付($ D、"[D] [MNN]、[Y]""de"は、()、())
Tisdag 2002年12月31日フォーマット - 日付($ dの、"[FNN] [D] [MNN] [Y]""SV"、()、())
[2002年12月31日]フォーマット - 日付($ D、"[[[Y0001] - [M01] - [D01 ]]]")
二千三形式 - 日付($ D、"[YWw]""EN"、()、())
einunddrei?igste Dezember形式 - 日付($ D、"[DWO] [MNN]""de"は、()、())
15:58フォーマット - 時間($ T、"[H]:[M01] [PN]""EN"、()、())
3時58分45秒午後フォーマット - 時間($ T、"[H]:[M01]:[S01] [PN]""EN"、()、())
3時58分45秒PM PDTフォーマット - 時間($ T、"[H]:[M01]:[S01] [PN] [ZN、*- 3]""EN"、()、())
3時58分45秒時PM PDTフォーマット - 時間($ T、"[H]:[M01】:[S01]時に[PN] [ZN、*- 3]""EN")
午後3時58分フォーマット - 時間($ T、"[H01]:[M01]")
15:58:45.762フォーマット - 時間($ T、"[H01]:[M01]:[S01] [F001]")
夜03時58分45秒GMT +02:00フォーマット - 時間($ T、"[H01]:[M01]:[S01] [Z]""EN"、()、())
15.58ウワーGMT +02:00フォーマット - 時間($ T、"[H01]:[M01]ウワー[Z]""de"は、()、())
火曜日に3.58pm、12月31日フォーマット- dateTimeを($ dtは、"[H] [M01] [PN]で[FNN]、[D1o] [MNN]")
2002年12月31日午後3時58分45秒フォーマット- dateTimeを($ dtは、"[M01] / [D01] / [Y0001] [H01]で:[M01]:[S01]")で

 
例:非グレゴリオ暦

次の例では、グレゴリオ暦以外のカレンダーを使用してください。

これらの例は、システム構成に応じて、すべてのブラウザでは正しく表示されない場合が非ラテン文字を使用してください。
説明要求結果
形式 - 日付($ D、"[D1] [MN] [Y1]""イスラム""AR""AH"、())26????1423イスラム
ユダヤ人(西洋の番号付き)形式 - 日付($ D、"[D] [MN] [Y]""彼は""AM"、())26???5763
ユダヤ人(伝統的なナンバリング付き)形式 - 日付($ D、"[D?T] [MN] [Y?T]""彼""AM"、())?"???????" ?
ユリウス暦(欧州旧暦)形式 - 日付($ D、"[D] [MNN] [Y]""エン""OS"、())2002年12月18日
タイのフォーマットの日付($ D、"[D1] [MN] [Y1]""目""BE"、())
</pre>