14

補間構文のtimestamp()関数は、次のような ISO 8601 形式の文字列を返します2019-02-06T23:22:28Z。ただし、このような文字列が必要です20190206232240706500000001。数字 (整数) のみで、ハイフン、空白、コロン、Z、T を含まない文字列。これを実現するシンプルでエレガントな方法は何ですか?

ハイフン、空白、コロン Z および T のすべての文字クラスを置き換えると機能します。

locals {
  timestamp = "${timestamp()}"
  timestamp_no_hyphens = "${replace("${local.timestamp}", "-", "")}"
  timestamp_no_spaces = "${replace("${local.timestamp_no_hyphens}", " ", "")}"
  timestamp_no_t = "${replace("${local.timestamp_no_spaces}", "T", "")}"
  timestamp_no_z = "${replace("${local.timestamp_no_t}", "Z", "")}"
  timestamp_no_colons = "${replace("${local.timestamp_no_z}", ":", "")}"
  timestamp_sanitized = "${local.timestamp_no_colons}"
}

output "timestamp" {
  value = "${local.timestamp_sanitized}"
}

結果の出力は、文字列が大幅に短いことを除いて、目的の形式になります。

Outputs:

timestamp = 20190207000744

ただし、このソリューションは非常に醜いです。例の文字列と同じ長さの文字列を生成するだけでなく、よりエレガントな方法で同じことを行う別の方法はあります20190206232240706500000001か?

4

3 に答える 3

11

現在の補間関数timestamp()RFC3339は、ソース コードの出力形式でハードコーディングされています。

https://github.com/hashicorp/terraform/blob/master/config/interpolate_funcs.go#L1521

return time.Now().UTC().Format(time.RFC3339), nil

したがって、あなたの方法に問題はありませんが、少し改善することができます。

locals {
  timestamp = "${timestamp()}"
  timestamp_sanitized = "${replace("${local.timestamp}", "/[- TZ:]/", "")}"

}

参照:

https://github.com/google/re2/wiki/Syntax

replace(string, search, replace) - 指定された文字列を検索して置換します。search のすべてのインスタンスは、replace の値に置き換えられます。検索がスラッシュで囲まれている場合、正規表現として扱われます。正規表現を使用する場合、replace は $n を使用して正規表現のサブキャプチャを参照できます。n はサブキャプチャのインデックスまたは名前です。正規表現を使用する場合、構文は re2 正規表現構文に準拠します

于 2019-02-07T00:31:49.530 に答える