121人参与 • 2025-02-14 • Javascript
在 next.js 中处理时区的几种推荐方案:
最佳实践是在服务器端始终使用 utc 时间存储和处理,只在显示给用户时才转换为本地时区。
import { format } from 'date-fns';
import { utctozonedtime } from 'date-fns-tz';
interface timedisplayprops {
utctimestamp: string | date;
}
export function timedisplay({ utctimestamp }: timedisplayprops) {
// 获取用户时区
const usertimezone = intl.datetimeformat().resolvedoptions().timezone;
// 将 utc 时间转换为用户时区时间
const localtime = utctozonedtime(new date(utctimestamp), usertimezone);
// 格式化显示
return <time>{format(localtime, 'yyyy-mm-dd hh:mm:ss')}</time>;
}
可以在应用启动时检测用户时区:
import { useeffect } from 'react';
function myapp({ component, pageprops }) {
useeffect(() => {
// 将用户时区存储在全局状态或 localstorage 中
const usertimezone = intl.datetimeformat().resolvedoptions().timezone;
localstorage.setitem('usertimezone', usertimezone);
}, []);
return <component {...pageprops} />;
}
推荐使用 dayjs 或 date-fns-tz 这样的库来处理时区转换:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
export function formatlocaltime(utctime: string | date, format = 'yyyy-mm-dd hh:mm:ss') {
const usertimezone = intl.datetimeformat().resolvedoptions().timezone;
return dayjs(utctime).tz(usertimezone).format(format);
}
服务器端存储:
api 响应:
客户端显示:
intl.datetimeformat() 获取用户时区测试注意事项:
describe('time formatting', () => {
it('should correctly convert utc to different timezones', () => {
const utctime = '2024-03-20t10:00:00z';
// 模拟不同时区
const mocktimezones = ['america/new_york', 'asia/shanghai', 'europe/london'];
mocktimezones.foreach(timezone => {
// 测试每个时区的转换
const localtime = formatlocaltime(utctime);
expect(localtime).tobedefined();
});
});
});
这样的设置可以确保您的应用在全球范围内都能正确显示时间。记住要在部署前在不同时区进行充分测试,特别是在处理跨日期边界的情况时。
到此这篇关于next.js中处理时区的常用方案推荐的文章就介绍到这了,更多相关next.js处理时区内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论