首页 > 其他分享 >sheetjs导出表格时间错误问题

sheetjs导出表格时间错误问题

时间:2023-02-10 17:24:45浏览次数:58  
标签:00 const 表格 导出 43 sheetjs date Date new

最近使用sheetjs,前端web去导出生成excel,xlsx表格。其中遇到一种问题,那就是时间出错了!比如多出8小时43秒少了43秒。看到这种问题的时候,我也一脸懵逼。先上图!

时间错误示例图1

时间错误示例图2

  • 不过在有些人电脑上导出时间确实非常的正确!

时间正确示例图1

错误显示的原因?

我找到了相关的文章描述该问题 GitHub地址

在当地时间 1901-01-01 00:00:00,上海时区由 LMT(Local Mean Time)切换为 CST (China Standard Time),与 GMT 的时差由 + 8:05:43 调整为 + 8:00:00。

所以有些机器上的时区切换导致时差调整不正确,所以前端js导出表格的时候,字符串转换成Date类型出现的时差误差错误,所以在表格生成的时候,日期出现多了多出8小时43秒少了43秒等等现象。

解决办法

直接算出误差的时间秒数,加上去就行了,下面就是js代码。

/**
 * 获取当前机器时间时区是否存在时间误差
 * @param {Date} date 比对的误差时间
 * @returns {Number} 误差毫秒
 */
function getTimezoneOffsetMS(date) {
  var time = date.getTime();
  var utcTime = Date.UTC(date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds());
  return time - utcTime;
}

/**
 * 矫正日期误差
 * @param {Date} date 需要矫正的日期
 * @returns {Date} 返回矫正后的日期
 */
function fixDate(date) {
  const importBugHotfixDiff = (function () {
    const basedate = new Date(1899, 11, 30, 0, 0, 0);
    const dnthreshAsIs = (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
    const dnthreshToBe = getTimezoneOffsetMS(new Date()) - getTimezoneOffsetMS(basedate);
    return dnthreshAsIs - dnthreshToBe;
  }());
  return (new Date(date.getTime() + importBugHotfixDiff));
}


/**
 * 是否需要矫正日期
 * @param {Date} date 需要判断的日期
 * @returns {Boolean}  是否需要矫正
 */
function isNeedFixDate(date) {
  const baseDate = new Date(1899, 11, 30, 0, 0, 0);
  const baseDateUtc = new Date(Date.UTC(1899, 11, 30, 0, 0, 0));
  const timezoneOffsetFix =
    baseDateUtc.valueOf() +
    baseDate.getTimezoneOffset() * 60000 -
    baseDate.valueOf();
  return new Date(date.valueOf() - timezoneOffsetFix).getTimezoneOffset() !== baseDate.getTimezoneOffset();
}

// 正常情况 时差没问题的 会显示这样
fixDate(new Date('2023-01-02 00:00:00')) // Mon Jan 02 2023 00:00:00 GMT+0800 (GMT+08:00)

// 下面是时差有问题的 
fixDate(new Date('2023-01-02 00:00:00')) // Sun Jan 01 2023 23:59:17 GMT+0800

按照修改后的时间,再调用sheetjs的方法导出xlsx后,时间就不会出错了。

案例demo地址

标签:00,const,表格,导出,43,sheetjs,date,Date,new
From: https://www.cnblogs.com/kongyijilafumi/p/17109706.html

相关文章

  • 直播app开发搭建,vue使用js-file-download完成导出功能
    直播app开发搭建,vue使用js-file-download完成导出功能1.安装js-file-downloadnpminstalljs-file-download​2.引入对应的功能模块importfileDownLoadfrom'js-file......
  • 前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码
    前端与数据展示前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此......
  • Vue课程57-循环渲染表格行的数据
    代码部分<!DOCTYPEhtml><htmllang="en"> <head> <metacharset="UTF-8"/> <metahttp-equiv="X-UA-Compatible"content="IE=edge"/> <metaname="viewpor......
  • .NET NPOI导出时间、公式等格式化
    1、业务背景做导入某业务模块的Excel表格文件时,利用NPOI组件导入,①导入的日期错乱(如XX-X月-2022),关于此种情况之前没做格式化做了单独处理,可以查看文章​​.netNPOIExcel......
  • Go--生成excel表格,读取excel表格数据
    先下载第三方依赖包:goget-ugithub.com/xuri/excelize/v2 代码:packagemainimport("fmt""github.com/xuri/excelize/v2")//生成excel表格func......
  • Element 中根据屏幕大小动态计算表格高度以实现固定表头
    在ElementUI的表格组件中,要想固定表头,必须给表格指定一个高度,但是用户的屏幕大小是不一样的,为了能将表格底部的分页区域始终显示在屏幕内,就需要动态计算表格的高度。以下是......
  • JavaScript 表格小游戏
    阅读目录JavaScript实现表格配对小游戏源码JavaScript实现动态显示表格数据源码源码解析JavaScript实现表格配对小游戏实例描述:当用户点击两个相同......
  • JavaScript 动态表格操作
    阅读目录JavaScript动态创建表格第一种示例第二种示例示例解析表格相关的属性和方法1.1Table对象集合1.2Table对象方法1.3Table对象常用属性1.4T......
  • 解决Revit导出FBX模型材质丢失的问题
    初次使用Revit导出fbx格式模型,在导出模型后发现模型材质丢失了,上网查询之后也没到具体原因是什么,不过倒是找到了解决方式:在Revit中安装naviswork插件,然后从revit中导出nwc......
  • 1.3表格表头单元格标签
    一般表头单元格位于表格的第一行或第一列,表头单元格里面的文本内容加粗居中显示,<Ht>标签表示HTML表格的表头部分(table head的缩写)<table><tr><th>姓......