为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 Flutter iso8601 DateTime 解码为 Go Api RFC3339

如何将 Flutter iso8601 DateTime 解码为 Go Api RFC3339

Go
慕哥6287543 2022-11-28 10:20:30
在我的 Go API 中,我试图使用 json 解码来解析以下 json。{"contract_id":0,"date_established":"2022-04-03T00:00:00.000","expiry_date":null,"extension_expiry_date":null,"description":"fffff"}我得到一个错误:parsing time "\"2022-04-03T00:00:00.000\"" as "\"2006-01-02T15:04:05Z07:00\"": cannot parse "\"" as "Z07:00"我该如何解决这个错误?这是我的结构:// Contract modeltype Contract struct {    ContractId          *int       `json:"contract_id"`    CompanyId           *int       `json:"company_id"`    DateEstablished     *time.Time `json:"date_established"`    ExpiryDate          *time.Time `json:"expiry_date"`    ExtensionExpiryDate *time.Time `json:"extension_expiry_date"`    Description         *string    `json:"description"`}这是我的代码:func (rs *appResource) contractCreate(w http.ResponseWriter, r *http.Request) {    var contract Contract    decoder := json.NewDecoder(r.Body)    err = decoder.Decode(&contract)
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

Go 使用 RFC 3339 编码时间,如果你控制正在生成的 json,你只需要更改2022-04-03T00:00:00.000为2022-04-03T00:00:00.000Z.


例如,这有效。


type Contract struct {

    ContractId          *int       `json:"contract_id"`

    CompanyId           *int       `json:"company_id"`

    DateEstablished     *time.Time `json:"date_established"`

    ExpiryDate          *time.Time `json:"expiry_date"`

    ExtensionExpiryDate *time.Time `json:"extension_expiry_date"`

    Description         *string    `json:"description"`

}


func main() {

    body := `{"contract_id":0,"date_established":"2022-04-03T00:00:00.000Z","expiry_date":null,"extension_expiry_date":null,"description":"fffff"}`


    var contract Contract

    reader := strings.NewReader(body)

    decoder := json.NewDecoder(reader)

    err := decoder.Decode(&contract)

    if err != nil {

        fmt.Println("Error: ", err)

    } else {

        fmt.Printf("Contract: %+v\n", contract)

    }

}

如果你不控制json,你需要写一个自定义的解组方法



查看完整回答
反对 回复 2022-11-28
?
LEATH

TA贡献1936条经验 获得超7个赞

这是我最终在 Flutter 中使用我的 Go api 和列类型以及在 Postgresql 中实现pgtype.Date的pgtype.DateTimestamptz解决DATE方案DATETIME。我无法使用具有这种数据类型的指针。


首先,我在 Flutter 中创建了一个这样的助手:


import 'package:intl/date_symbol_data_local.dart';

import 'package:intl/intl.dart';


extension DateTimeExtension on DateTime {

  String format([String pattern = 'dd/MM/yyyy', String? locale]) {

    if (locale != null && locale.isNotEmpty) {

      initializeDateFormatting(locale);

    }

    return DateFormat(pattern, locale).format(this);

  }


  String formatDbDateTime(

      [String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", String? locale]) {

    if (locale != null && locale.isNotEmpty) {

      initializeDateFormatting(locale);

    }

    return DateFormat(pattern, locale).format(this);

  }


  String formatDbDate([String pattern = 'yyyy-MM-dd', String? locale]) {

    if (locale != null && locale.isNotEmpty) {

      initializeDateFormatting(locale);

    }

    return DateFormat(pattern, locale).format(this);

  }


  String formatLocalDate([String pattern = 'dd MMMM yyyy', String? locale]) {

    if (locale != null && locale.isNotEmpty) {

      initializeDateFormatting(locale);

    }

    return DateFormat(pattern, locale).format(this);

  }


  String formatLocalDateTime(

      [String pattern = 'dd MMMM yyyy h:mm a', String? locale]) {

    if (locale != null && locale.isNotEmpty) {

      initializeDateFormatting(locale);

    }

    return DateFormat(pattern, locale).format(this);

  }

}

我在我的 Flutter 模型中使用它来格式化我的 Go Api 的日期:


if (planAcceptedDate != null) {

  data['plan_accepted_date'] = planAcceptedDate!.formatDbDateTime();

} else {

  data['plan_accepted_date'] = null;

}


if (invoiceDate != null) {

  data['invoice_date'] = invoiceDate!.formatDbDate();

} else {

  data['invoice_date'] = null;

}

在我的 Flutter 视图表单中,我这样使用它:


        Container(

          padding: EdgeInsets.all(8.0),

          child: Text(

            _matter.planAcceptedDate == null

                ? ''

                : _matter.planAcceptedDate!.formatLocalDateTime(),

            style: TextStyle(

              color: appTextColor,

              fontWeight: FontWeight.normal,

              fontSize: _user.fontsize,

            ),

          ),

        ),

        Container(

          padding: EdgeInsets.all(8.0),

          child: Text(

            _matter.invoiceDate == null

                ? ''

                : _matter.invoiceDate!.formatLocalDate(),

            style: TextStyle(

              color: appTextColor,

              fontWeight: FontWeight.normal,

              fontSize: _user.fontsize,

            ),

          ),

        ),

我的 Go 结构如下所示:


PlanAcceptedDate pgtype.Timestamptz `json:"plan_accepted_date"`

InvoiceDate      pgtype.Date        `json:"invoice_date"`


查看完整回答
反对 回复 2022-11-28
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号