问题:
前端时间变量代码
const date=new Date();
date.setHours(0, 0, 0, 0);
date.setFullYear(2023);
date.setMonth(1);
date.setDate(30);
console.log(date)
const formattedDate = moment(date).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
this.dateString=formattedDate
后端接收字符串并将其转为date类型
DateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date newDate =null;
try {
newDate = targetFormat.parse(dateString);
System.out.println(newDate); // 输出转换后的Date对象
} catch (Exception e) {
e.printStackTrace();
}
结果:
前端:2023-02-30
后端:2023-03-02
因为前端和后端对日期的解析方式不一致,导致了日期的转换错误。
在前端,JavaScript的Date对象支持传入一个字符串来创建日期对象,如下所示:
var date = new Date('2022-01-30');
在这种情况下,JavaScript会将字符串按照ISO 8601标准解析成本地时间。因为ISO 8601标准中规定日期格式为"YYYY-MM-DD",所以上面的代码会创建一个表示2022年1月30日的Date对象。
在后端,Java中的Date对象也可以从字符串解析得到,如下所示:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2022-01-30");
在这种情况下,Java会按照指定的日期格式解析字符串。因为上面的代码中指定的日期格式为"yyyy-MM-dd",所以会创建一个表示2022年1月30日的Date对象。
如果前端和后端对日期的解析方式不一致,就会导致日期的转换错误。比如,如果前端传递的日期字符串是"2022-01-30",但是后端将其解析为了"2022-03-02",那么可能是因为前端和后端对日期的解析方式不一致,比如:
- 前端传递的日期字符串中包含时区信息,但是后端没有对时区进行处理,导致日期被错误解析;
- 前端和后端对日期的解析方式不一致,比如前端按照ISO 8601标准解析日期,而后端按照其他标准解析日期,导致日期被错误解析。
为了避免这种情况发生,建议前后端采用统一的日期格式,并且在传递日期时,明确指定时区信息。比如,在前端可以使用moment.js库来格式化日期并指定时区信息,如下所示:
导入moment和moment-timezone
npm install moment --save
npm install moment-timezone --save
如果下载失败则
npm install moment --force
npm install moment-timezone --force
var date = moment('2022-01-30').tz('Asia/Shanghai').format('YYYY-MM-DD');
在这种情况下,moment.js会将日期字符串按照ISO 8601标准解析成本地时间,并将本地时间转换成指定时区的时间。然后,再将时间格式化成指定的日期格式。在后端也可以采用类似的方式,使用SimpleDateFormat类来格式化日期并指定时区信息,如下所示:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
Date date = format.parse("2022-01-30");
在这种情况下,SimpleDateFormat类会将日期字符串按照指定的日期格式解析成本地时间,并将本地时间转换成指定时区的时间。然后,再将时间格式化成指定的日期格式。这样,前后端就可以采用统一的日期格式,并且在传递日期时,明确指定时区信息,避免日期转换错误。
加了时区后
前端代码
const date=new Date();
date.setHours(0, 0, 0, 0);
date.setFullYear(2023);
date.setMonth(1);
date.setDate(30);
console.log(date)
const formattedDate = moment(date).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
this.dateString=formattedDate
后端代码
DateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
targetFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); //设置时区
Date newDate =null;
try {
newDate = targetFormat.parse(dateString);
System.out.println(newDate); // 输出转换后的Date对象
} catch (Exception e) {
e.printStackTrace();
}
结果
前端:2023-2-30
后端:2023-2-30
???明明我设置的是1月30号怎么成了2月30后,
原因:setMonth()从0到11的整数(表示个月份,从一月到十二月)
将1改为0即可。