docker sveltekit操作中Date.parse()的行为不一致(客户端与服务器端)

polhcujo  于 2023-05-28  发布在  Docker
关注(0)|答案(2)|浏览(123)

我使用的是来自svelte strap(https://sveltestrap.js.org/iframe.html?id=components--inputs&viewMode=story)的日期时间选择器,它以“2023-05- 25 T20:36”的形式输出日期时间字符串,我可以通过将日期时间输入的值绑定到本地变量并在控制台记录它来告诉它。这在+page.svelte中是正确的,我打印出我将输入绑定到的变量,在+page.server.js中的动作中也是如此。然而,这里是事情变得奇怪的地方:当我在+page.svelte中调用Date.parse()时,这会给我预期的UTC时间戳(假设2023-05- 25 T20:36是本地时间而不是UTC),但是当我在+page. server. js中对同一字符串调用Data.parse()时,它会假设字符串2023-05- 25 T20:36是UTC时间而不是本地时间,因此给出了错误的时间戳。这是否是我的sveltekit节点配置设置的问题?为什么会出现这种奇怪的差异?请注意,我的当地时区是MT时间(比美国东部时间晚2小时,比加州早1小时)
代码(+page.svelte):

<Form method="POST">
    Set Draft Time!
    <Input
      type="datetime-local"
      name="datetime"
      id="exampleDatetime"
      placeholder="datetime placeholder"
      bind:value={timeStamp} 
    />
    {timeStamp}
    {Date.parse(timeStamp) /*  THIS GIVES CORRECT VALUE CORRECTLY ASSUMING THAT timeStamp is in local time instead of UTC time!!}
    <button type="submit">Submit Here!</button>
  </Form>

+page.server.js

export const actions = {
    default: async ({cookies,request,params}) => {
        const data = await request.formData();
        const dateAsString = data.get("datetime") // This gives the correct local datetime string 2023-05-25T20:36
        const timestamp = Date.parse(dateAsString) // This is where the discrepancy is occurring. For some reason, Date.parse() is assuming the input time string is in UTC time instead of local time, and thus the timestamp does not match what I would expect it to. 
    }
};
iih3973s

iih3973s1#

时间格式是不明确的,因此这里不定义实现行为。
该值可能应该规范化,因此时间部分对于UTC为HH:mm:ssZ,或者对于本地偏移量为HH:mm:ss+HH:mm/HH:mm:ss-HH:mm。(参见日期时间字符串格式)

vktxenjb

vktxenjb2#

除了接受答案之外,另一种将正确的时间戳从浏览器传递到服务器的方法是使用用途:enhance函数,如sveltekit文档所示:https://kit.svelte.dev/docs/form-actions。这允许您在formData中传递自定义值,而不是表单提交默认传递的值。这就是我最终做的:

<form 
    method="POST"
    use:enhance={({ data }) => {
      data.set("unixTimeStamp",Date.parse(timeStampMillis))
    }}>
    Set Draft Time!
    <Input
      type="datetime-local"
      name="datetime"
      id="exampleDatetime"
      bind:value={timeStampMillis}
    />

通过在表单提交中传递值Date.parse(timeStampMillis),我们依赖于浏览器对Date.parse()的实现,而不是Node.js服务器端,因为浏览器正确地假设时间串“2023-05- 25 T20:36”是本地时间。在+page.server.js中,我们可以使用以下命令检索解析后的值而不是时间字符串:

export const actions = {
    default: async ({cookies,request,params}) => {
        console.log("in default action!")
        const data = await request.formData();
        const dateAsString = data.get("unixTimeStamp")
        console.log("unixTimeStamp is:" + dateAsString)

相关问题