mongodb 使用nodejs javascript从数据库转换日期,以便在html日期输入中使用奇怪的行为

w1e3prcc  于 2023-05-17  发布在  Go
关注(0)|答案(2)|浏览(128)

希望并感谢得到一些解释以下
这个问题是关于日期的,我知道我可以使用像moments这样的包,但是,在这种情况下,我不需要那么多地使用日期。我还知道从各自的Date get函数中获得的day和month返回的值比实际对应的值小1。
因此,我有一个将数据保存到数据库的表单,至于显示保存的数据,我需要将日期转换为yyyy-mm-dd格式,为此,我使用一个小函数和分离日期部分的方法,并将它们以适当的顺序重新加入日期选择器。
enter image description here
用于格式化日期的函数(对不起,所有的日志)
enter image description here
对于每条记录,此函数被调用两次,因为每条记录有两个日期,控制台输出如下:
enter image description here

// the code for the function

export function dateToPug(dateIso) {

    console.log('\ndate string from db' , dateIso, '\n')
    
    const date = new Date(dateIso)
    
    console.log('toDateString',date.toDateString(), '\n')

    console.log('date string converted to date', date.toISOString(), '\n')
    
    const day = (date.getDate())// + 1)
    
    console.log('day extracted from date', day, '\n')
    
    // day < 10 ? day =`0${date.getDate()}` : ''
    
    const month = (date.getMonth())// + 1) 

    console.log('month extracted from date', month, '\n')

    // month < 10 ? `0${date.getMonth()}` : ''

    const year = date.getFullYear()

    console.log(`${year}-${month}-${day}`, '\n')

    return `${year}-${month}-${day}`

}

//输出

date string from db **1900**-**10**-**10**T00:00:00.000Z       // first date from the database record

toDateString Tue **Oct** **09** 1900        // converted to date string changes the day but not the month

date string converted to date **1900-10-10**T00:00:00.000Z    // date in iso format

day extracted from date **9**          // got day -1 as expected

month extracted from date **9**        // got month -1 as expected

**1900-9-9**     // date in format for the form input date (with trimmings that will have to be removed)

date string from db **1950**-**10**-**10**T00:00:00.000Z     // second date from the database record

toDateString Tue **Oct** **10** 1950    // converted to date string neither change the day nor the month

date string converted to date **1950-10-10**T00:00:00.000Z    // date in iso format

day extracted from date **10**          // got day unchanged

month extracted from date **9**         // got month -1 as expected

**1950-9-10**    // date in format for the form input date (with trimmings that will have to be removed)

我错过了什么?

sd2nnvve

sd2nnvve1#

您没有考虑时区差异。
我在你的函数中添加了这一行

console.log('getTimezoneOffset',date.getTimezoneOffset())

使用node.js测试:

> dateToPug("1950-10-10T00:00:00.000Z")

date string from db 1950-10-10T00:00:00.000Z

toDateString Mon Oct 09 1950

getTimezoneOffset 300
date string converted to date 1950-10-10T00:00:00.000Z

day extracted from date 9

month extracted from date 9

1950-9-9

'1950-9-9'

getDate()返回1-31,即该月的实际日期,而getMonth()返回0-11,即month - 1,因此这正确地指示了所述时区偏移的月9日。
请注意,伦敦10月10日上午12点(UTC)对于整个西半球来说仍然是10月9日。
日期函数默认使用本地系统时区。根据您运行代码的方式,您可能需要显式指定时区设置,以使其按照您想要的方式运行。
或者只是利用已经解决这个问题的其他人多年的工作,并使用日期时间库。

zzlelutf

zzlelutf2#

我就是这样解决的,至少我知道。最后,我终于找到了一个图书馆。但不是现在。

export function dateToPug(dateIso) {

    const date = new Date(dateIso)
    
    let day = (date.getUTCDate())// + 1)
    day < 10 ? day =`0${day}` : ''
    
    let month = (date.getUTCMonth() + 1) 
    month < 10 ? month = `0${month}` : ''
    
    const year = date.getUTCFullYear()

    return `${year}-${month}-${day}`

}

相关问题