JavaScript CSV 下载 IP Long转字符串 天数转日期等
2023-02-03
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
<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;
}
```