为什么我的秒表在刷新时增加固定的时间?

0 投票
1 回答
52 浏览
提问于 2025-04-14 16:49

我有一个Vue.js的脚本,它在我刷新页面时会给我的计时器加上额外的6个小时。这个脚本其实就是一个按钮,点击后可以记录时间,停止时会把时间发送到一个Django模型里。我可以正常记录时间,但是每次刷新页面后,我的计时器上总是多出6个小时:

Vue.js脚本:

var NavbarApp = {
            data() {
                return {
                    seconds: {{ active_entry_seconds }},
                    trackingTime: false,
                    showTrackingModal: false,
                    timer: null,
                    entryID: 0,
                    startTime: '{{ start_time }}'
                }
            },
            delimiters: ['[[', ']]'],
            methods: {
                startTimer() {
                    fetch('/apps/api/start_timer/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        }
                    })
                    .then((response) => {
                        return response.json()
                    })
                    .then((result) => {
                        this.startTime = new Date()
                        this.trackingTime = true

                        this.timer = setInterval(() => {
                            this.seconds = (new Date() - this.startTime) / 1000
                        }, 1000)
                    })
                },
                stopTimer() {
                    fetch('/apps/api/stop_timer/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        }
                    })
                    .then((response) => {
                        return response.json()
                    })
                    .then((result) => {
                        this.entryID = result.entryID
                        this.showTrackingModal = true
                        this.trackingTime = false

                        window.clearTimeout(this.timer)
                    })
                },
                discardTimer() {
                    fetch('/apps/api/discard_timer/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        }
                    })
                    .then((response) => {
                        this.seconds = 0
                        this.showTrackingModal = false
                    })
                },
                addLater() {
                    this.seconds = 0
                    this.showTrackingModal = false
                },
                addToTask() {
                    console.log('addToTask')
                    window.location.href = '/apps/track_entry/' + this.entryID + '/'
                }
            },
            mounted() {
                if (this.seconds !== 0) {
                    this.trackingTime = true
                    this.timer = setInterval(() => {
                        this.seconds = (new Date() - new Date(this.startTime)) / 1000
                    }, 1000)
                }
            },
            computed: {
                readableSeconds() {
                    const d = Number(this.seconds);
                    const h = Math.floor(d / 3600);
                    const m = Math.floor(d % 3600 / 60);
                    const s = Math.floor(d % 3600 % 60);

                    const hDisplay = h > 0 ? h + (h == 1 ? "h, " : "h, ") : "";
                    const mDisplay = m > 0 ? m + (m == 1 ? "m, " : "m, ") : "";
                    const sDisplay = s >= 0 ? s + (s == 1 ? "s" : "s") : "";

                    return hDisplay + mDisplay + sDisplay; 
                }
            }
        }

        Vue.createApp(NavbarApp).mount('#navbar-app')

HTML:

                                                <div class="col-md-auto mt-md-0 mt-4" id="navbar-app">
                                                    <div class="hstack gap-1 flex-wrap">
                                                        <div class="navbar-item" v-if="!trackingTime">
                                                            <div class="buttons">
                                                                <button class="btn btn-success add-btn" @click="startTimer()">
                                                                   Start Timer
                                                                </button>
                                                            </div>
                                                        </div>
                            
                                                        <div class="navbar-item" v-else>
                                                            <div class="buttons">
                                                                <div class="buttons">
                                                                    <button class="btn btn-warning add-btn" @click="stopTimer()">
                                                                        [[ readableSeconds ]] (stop)
                                                                    </button>
                                                                </div>
                                                            </div>
                                                        </div>

当我点击按钮时,时间在正常记录: 这里是图片描述

但是当我刷新页面后,计时器上又多了6个小时: 这里是图片描述

如果我缺少了什么信息或者代码,请告诉我。

1 个回答

2

Django 5.0会自动处理日期。这意味着如果你的用户在UTC-6时区,系统会自动加上6个小时,然后以UTC时间存储。当你使用这个日期时,它会转换成当地时间,你通常不会遇到问题。

如果你使用的是旧版本,比如4.2,你只需要设置USE_TZ = True就可以了。

如果这样还不能解决你的问题,这份文档可能会对你有帮助。特别是这一部分,讲的是如何强制使用当地时间。这部分解释了当USE_TZ设置为真或假时,结果会有什么不同。

(我不能写评论,因为我的声望太低,而且我不懂vue.js,抱歉。)

希望我能帮到你。

撰写回答