JavaScript CSV 下载 IP Long转字符串 天数转日期等 home 编辑时间 2023/02/03 ![](/api/file/getImage?fileId=63dc86bada7405001301bf2c) <br> ## 前言 如题 记录一下最近常用的JS方法 例如 下载CSV IP地址转String 天数转日期格式化等 <br> ## 代码 <br> **纯前端实现CSV文件下载** ```javascript // array数组直接生成CSV下载 解决windows下乱码问题 downloadCSV: function () { let csv = '标题栏1,标题栏2,标题栏3,标题栏4,\n'; for (const index in this.tableData) { const obj = this.tableData[index]; // 标题1234对应的4个字段的数据 csv += obj.id + ","; csv += obj.name + ","; csv += obj.mobile + ","; csv += obj.createTime + "\n"; } // 关键代码 解决Windows系统中文乱码问题 const blob = new Blob(["\ufeff" + csv], { type: 'text/csv;charset=utf-8;' }); // 模拟A标签下载 const anchor = document.createElement('a'); anchor.href = URL.createObjectURL(blob); anchor.target = '_blank'; anchor.download = '文件名.csv'; anchor.click(); } ``` <br> **IP地址 Long转String** 现在MySql推荐用bigint存ip地址,据说比varchar存科学 对应MySql `INET_NTOA` 方法 ```sql SELECT INET_NTOA(3232235521) -- 192.168.0.1 SELECT INET_ATON('192.168.0.1') -- 3232235521 ``` <br> 前端拿到Long类型IP用此方法转为传统格式例如 `192.168.0.1` ```javascript ipFormat: function (number) { return number ? (number >>> 24) + "." + (number >> 16 & 0xFF) + "." + (number >> 8 & 0xFF) + "." + (number & 0xFF) : ''; } ``` <br> 顺便再贴一下Java的 2个类型互转方法 ```java public static Long ipAtoN(String ipAddr) { long ip = 0; if (StringUtils.isNotBlank(ipAddr) && ipAddr.contains(".") && ipAddr.length() <= 15) { try { String[] temp = ipAddr.split("\\."); ip = ((Long.parseLong(temp[0]) * 256L + Long.parseLong(temp[1])) * 256L + Long.parseLong(temp[2])) * 256L + Long.parseLong(temp[3]); } catch (Exception e) { e.printStackTrace(); } } return ip; } public static String ipNtoA(long ip) { StringBuilder sb = new StringBuilder(); sb.append(ip >>> 24).append("."); sb.append((ip & 0xFFFFFF) >>> 16).append("."); sb.append((ip & 0xFFFF) >>> 8).append("."); sb.append(ip & 0xFF); return sb.toString(); } ``` <br> **天数转日期** 对应MySql `TO_DAYS` 方法,返回从公元0000年至date日期的天数 ```sql SELECT TO_DAYS('2023-01-01') -- 738886 ``` 前端拿到天数后转回String日期方法 ```javascript /** 核心方法 传入天数 返回日期格式 yyyy-MM-dd */ daysFormat: function(days) { let year = 0, month = 0, day = 366; while (days > day) { days -= day; year++; day = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 366 : 365; } let months = [31, year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] while (days >= months[month]) { days -= months[month]; month++; } return year + '-' + this.numberFormat(month + 1) + '-' + this.numberFormat(days + 1) } /** 数字不满10前面加0 例如 5 返回字符串 05 */ numberFormat: function(num) { return num < 10 ? '0' + num : num; } ``` 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay 饥荒自建 Docker 专用服务器 私服 学习笔记 Don't Starve dst-server 2023 免费对象存储 OSS CDN 推荐 省钱攻略