1

AesonServantの変換に困惑していZonedTimeます。

私のServantアプリには、url: で時間を指定します.../2016-12-18T07:51:00+03:00/...

ServantZonedTimeで簡単に変換でき... :> Capture "zt" ZonedTime :> ...ます。

次に、私のアプリはいくつかの計算を行い、json-response でこれと他のいくつかのZonedTimes をクライアントに返したいと考えています。

入力タイムゾーンがゼロでない場合+0X:00(X /= 0)、出力でも を取得+0X:00しますが、入力で を与える.../2016-12-18T07:51:00+00:00/...と、応答で を取得し2016-12-18T07:51:00Zます。Servantそして、この文字列を で再度フィードしようとすると.../2016-12-18T07:51:00Z/...Servantへの変換に失敗しZonedTimeます。実際は返品HTTP 400 (Bad Request)です。

なんで?何のために?

4

2 に答える 2

0

Ok。

したがって、...Z記法が Servant as によって適切に解析されるUTCTimeとすぐに、別のキャプチャ行を作成しました。

:<|> "myendpoint" :> Capture "zt" ZonedTime :> ...
:<|> "myendpoint" :> Capture "utct" UTCTime :> ...

そして、対応するハンドラを作成しました。このリテラルを使用すると、+xx:xxget が取得されZonedTimeて 1 つのハンドラーに移動し、リテラルZ が 2 行目に取得されて 2 番目のハンドラーに移動します。これは最初のハンドラーと同じですが、オンザフライに変換UTCされます。Zoned


アップデート

私のシステムがどのように機能しているかが、URL で文字列のエンコード時間にさまざまなバリエーションがある可能性があるという事実につながることを理解するようになりました。

  1. タイムゾーンとして、+03:00またはZUTCの場合があります。
  2. 私はのような小数秒を持っているかもしれません2016-12-09T15:04:26.349857693845+05:00

標準Captureの forは、タイムゾーンとしても小数秒としてZonedTimeも理解していません。Z

だから、別の回答で提案されているように、私はどういうわけか方向にしました。

Capturing ラインを 1 つだけ入れます

"daymonth" :> Capture "zt" ZonedTime' :> Capture "fl" Double :> Get '[JSON] Value

そして私は新しいタイプを作りZonedTime'ます。それは私のためにすべてをやっています。

newtype ZonedTime' = ZonedTime' { unwrap :: ZonedTime }

instance FromHttpApiData ZonedTime' where
  parseUrlPiece text = Right zt
    where
      strRaw = unpack text
      str = subRegex (mkRegex "Z$") strRaw "+00:00"
      zt = ZonedTime' (parseTimeOrError False defaultTimeLocale "%Y-%m-%dT%H:%M:%S%Q%z" str)
  1. Z私は問題に対処し、それを+00:00
  2. %Q次に、秒の小数部分をキャッチするフォーマット文字列を指定して、文字列の解析を手動で記述します。
于 2016-12-23T00:22:38.233 に答える