V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq309187341
V2EX  ›  Node.js

求助一个有关 nest.js 中的问题。

  •  
  •   qq309187341 · 241 天前 · 2218 次点击
    这是一个创建于 241 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我使用 nest.js+typeorm 进行后端开发。我在实体类中定义了一个创建时间
    @Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP", unique: true })
    然后取出数据的时候,格式是日期形式的"create_time": "2023-08-27T21:55:45.000Z",
    这个格式,前端接收了需要再转一下。才能变成 '2021-08-31 07:56:10'.
    要么一种就是在服务层对取出的数据在转化一下。
    想要问一下,实体类中有没有办法对取出的数据进行转化。
    29 条回复    2023-08-30 22:58:56 +08:00
    NessajCN
        1
    NessajCN  
       241 天前
    需要转什么?
    timestamp 发到前端你 new Date(timestamp) 直接用就好了呀
    githmb
        2
    githmb  
       241 天前
    你变量的数据类型是 String 吧?改成 Date 就行了
    mdn
        3
    mdn  
       241 天前
    转换后的时间是没有时区,非 +8 时区用户会看到不正确的时间
    应该前端接收 iso 、时间戳,js 转换时间
    lzgshsj
        5
    lzgshsj  
       241 天前   ❤️ 1
    显示啥样这不就该是前端的活吗
    qq309187341
        6
    qq309187341  
    OP
       241 天前
    @NessajCN 发给前端的格式不一样,还需要转一下。所以我想直接在后端进行转化了。类似 java 里面的 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")这样的注解
    qq309187341
        7
    qq309187341  
    OP
       241 天前
    @githmb 是 Date 的,但是存入数据库后取出来是 2023-08-27T21:55:45.000Z"这样的,我希望是 2021-08-31 07:56:10 这样。希望在实体类中就能转化掉。java 中有 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")的注解,我想知道 typeorm 里面有没有类似的注解
    NessajCN
        8
    NessajCN  
       241 天前
    @qq309187341 你直接发 timestamp 有什么问题?
    NessajCN
        9
    NessajCN  
       241 天前
    如果你怕直接发 Date 对象不好 serialize,那你+Date 一下发 int64 呗,为啥要费那老劲弄一长串字符串
    qq309187341
        10
    qq309187341  
    OP
       241 天前
    @NessajCN 直接发送的话,前端还需要转化一层。我期望这个日期格式,直接服务器转化掉就好了。并不是很特别的字段类型。
    YEX1024
        11
    YEX1024  
       241 天前   ❤️ 1

    楼上不是有答案了
    Tyaqing
        12
    Tyaqing  
       241 天前
    发原始时间给前端,前端有很多库,转更灵活一些
    NessajCN
        13
    NessajCN  
       241 天前
    @qq309187341 你那前端不会自己用 new Date(timestamp) 和 data.toLocalString() 方法吗.....那你就服务端用这两个方法转了给他呗
    Encloud
        14
    Encloud  
       241 天前
    ```typescript
    @CreateDateColumn()
    @Transform((d) => moment(d.value).toDate().getTime())
    createTime: Date;
    ```
    我是把 date 转为 timestamp ,用了 moment ,你根据自己需求改就好
    oppddd
        15
    oppddd  
       241 天前
    powerless
        16
    powerless  
       241 天前
    大佬们太强了
    zzh2036
        17
    zzh2036  
       241 天前
    不想要 iso 格式,可以在 app.module 注册 typeorm 时,dateStrings 设置为 true
    https://typeorm.io/data-source-options#mysql--mariadb-data-source-options
    shyx
        18
    shyx  
       241 天前 via Android
    这种可以让前端去做的事,就不应该消耗服务器资源
    Pastsong
        19
    Pastsong  
       241 天前 via Android
    后端又不知道浏览器时区,你要怎么序列化?
    lwrench
        20
    lwrench  
       241 天前
    前后端交互时间戳就好了,你不知道访问的用户是什么时区,后端转太麻烦
    fengYH8080
        21
    fengYH8080  
       241 天前   ❤️ 1
    @YEX1024 说的在 entity 里转是对的。但是你要这样去用来转时间的逻辑是错的。所有的时间交互都应该带时区或者用时间戳,无论是入口还是出口,显示端根据自身时区去做格式化展示。而你这样直接服务端处理了,就相当于前端页面在全球都是展示你服务器时区的时间,明显是有问题,当然,只考虑自己时区无所谓,也不会拓展的话,但是终归是不标准。
    Zchary
        22
    Zchary  
       241 天前
    建议早日弃坑 TypeORM
    LandCruiser
        23
    LandCruiser  
       241 天前
    @Zchary 哪个好用呢? prisma 还是 mikro?
    qq309187341
        24
    qq309187341  
    OP
       241 天前
    @zzh2036 哥你这方法可行,方便快捷
    qq309187341
        25
    qq309187341  
    OP
       241 天前
    @fengYH8080 我这是小项目,如果纯国内的项目其实涉及不到时区吧。不知道大家平时后端对于需要创建日期,更新日期存什么?时间戳么?求问,我入门不太了解这个规范。我看公司的项目好像也是日期。
    YEX1024
        26
    YEX1024  
       241 天前
    @fengYH8080 受教 我这个服务器是在海外 也主要是给海外用户看的 而运营是在国内 所以在后台添加文章的时间要和页面展示的时间一致 我这里就只考虑自己的时区了
    fengYH8080
        27
    fengYH8080  
       240 天前
    @qq309187341 其实你小项目也涉及到时区,只是估计你部署的服务器默认给你的是亚洲上海时区而已,然后你前端也是东八区,自然就刚好对上。如果你服务迁移服务器或者用 docker 容器部署,你服务有可能就基于 0 时区上,那你前端展示的时间就会少 8 个小时。这就是隐患。
    至于方案,用标准时间包去做时间处理就好了,其实就是带着时区的时间去做交互和转换,这样谁都知道这个时间是表示哪个时间点,至于字符串格式的时间 2023-01-01 00:00:00 ,在于 24 个时区就有 24 个不同的时间。所以,如果是后端的活是不要推给客户端,但是该是客户端的活,也不要揽下来,各自负责各自的责任。前端业务要显示 YYYY-MM-DD 或者 DD/MM/YYYY 格式,那就让前端自己用时间处理包搞,后端负责返回标准时间格式就行。
    再说下时间戳,可以理解为 0 时区的 UTC 时间,但是我一般不用,放数据库里不直观,查个数据还得转换一下才能理解。
    fengYH8080
        28
    fengYH8080  
       240 天前
    @qq309187341 感觉你可能迷惑的点是存在数据库里的时间字段,其实数据库也是有时区的,你设置了 datetime 格式的字段,显示的是 2023-01-01 00:00:00 这样的格式,如果你数据库设置了 0 时区,那你就在理解上加 8 小时就好,如果是东八区,那就跟我们北京时间一致。
    你服务端用 UTC 格式的时间去存数据库,数据库自己会根据自己时区去转换好时间存进去,显示的是数据库时区的时间。我没具体去测过这块,你可以试一下,给数据库不断换时区,看下是不是这样的表现形式。
    qq309187341
        29
    qq309187341  
    OP
       240 天前
    @fengYH8080 感谢详细的回复。目前我按照上面一个兄弟说的在 typeorm 上设置 dateStrings 将时间字符串化了,这样取出数据的时候,时间是正常的。2023-08-30 12:22:22 。之前那个是"2023-08-27T21:55:45.000Z"返回给前端还需要在他们转一层。至于前端还需要再转那就前端自己来了。另外你说的时区,我数据库确实也如你说的少了 8 个小时,后来我设置数据库的时区为上海解决了。目前先这样吧。小项目暂时没有考虑到很多。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2797 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:28 · PVG 13:28 · LAX 22:28 · JFK 01:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.