2020-12-12

本文介绍如何解决Windows AMD64环境下使用Go语言时遇到的libiconv库匹配问题。通过自行编译libiconv库,并调整环境配置实现与iconv-go库的兼容。

https://my.oschina.net/u/659405/blog/342406
windows go amd64 libiconv 缺失报错问题
windows amd64 的go环境使用的gcc环境带的libiconv库不匹配,使用iconv-go库的时候报错,就自己编译了一个
步骤如下,下载libiconv源代码http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
安装msys64
http://blog.youkuaiyun.com/akof1314/article/details/17842215
软件安装
下载msys2-x86_64软件包,双击安装到某根目录下,比如D:\msys64。不要用空格目录
打开运行mingw64.exe
pacman是MSYS2自带的软件管理工具:
可通过修改msys64\etc\pacman.d下的三个文件修改软件源,可供选择的有:中国科学技术开源软件镜像、北京理工大学镜像、日本北陆先端科学技术大学院大学SourceForge镜像、The UK Mirror Service Sorceforge mirror等。
下载后的软件包默认存放目录msys64\var\cache\pacman\pkg;若命令行下载速度较慢,可以到到软件源网站使用下载工具下载相应的软件包,然后拷贝到此目录,接着使用命令行进行安装。
运行msys2_shell.bat: pacman -Sy 更新本地包数据
升级核心包:pacman -S --needed filesystem msys2-runtime bash libreadline libiconv libarchive libgpgme libcurl pacman ncurses libintl, 之后需要关闭所有 MSYS2 shell,然后运行 autorebase.bat
升级其他包:pacman -Su
常用命令: 
pacman -Q查看已安装的软件包
pacman -S -g查看软件组
pacman -Q -g base-devel查看软件组包含的软件
pacman -Q -l vim查询软件包的内容
pacman -Q -s nettle查询软件所在的包
查看工具帮助:pacman -h ;pacman -S -h

建议通过安装软件组来安装工具链
应为是go64所以安装gcc 64
pacman -S mingw-w64-x86_64-toolchain
p
            pacman -S mingw-w64-i686-toolchain
p
            pacman -S base-devel
p
            pacman -S vim


打开msys,gcc -v测试保证是默认gcc版本
然后进入libiconv的解压目录
./configure
make
在lib/.libs目录存在生成目标文件
拷贝libiconv.dll.a(文件可以不用)以及libiconv-2.dll至iconv.h相关目录(GOPATH=D:\WebstormProjects\testgo\clib目录下)
go get https://github.com/qiniu/iconv
修改源码D:\WebstormProjects\testgo\src\github.com\qiniu\iconv\iconv.go
添加
//#cgo CFLAGS:  -ID:/WebstormProjects/testgo/clib     //-I表示搜索头文件目录
//#cgo LDFLAGS: -LD:/WebstormProjects/testgo/clib -llibiconv-2  //-L表示搜索动态库1目录
编译输出目录,记得运行时加上
set path=D:\WebstormProjects\testgo\clib;%path%
不然会报错找不到dll

D:\Program\msys64\mingw64\include下有这个头文件和库

要将**时间戳**(timestamp)格式化为 `2020-12-12 12:12:00` 这种可读的时间格式,你可以使用 JavaScript 原生方法或借助如 `moment.js`、`dayjs` 等库。下面我先用 **原生 JS 实现**,再推荐更优雅的方案。 --- ### ✅ 方法一:使用 JavaScript 原生 Date API ```js function formatTimestamp(timestamp) { const date = new Date(timestamp) // 获取年月日时分秒 const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') // 月份从0开始 const day = String(date.getDate()).padStart(2, '0') const hour = String(date.getHours()).padStart(2, '0') const minute = String(date.getMinutes()).padStart(2, '0') const second = String(date.getSeconds()).padStart(2, '0') return `${year}-${month}-${day} ${hour}:${minute}:${second}` } ``` #### 🔧 使用示例: ```js const timestamp = 1607755920000 // 对应 2020-12-12 12:12:00 console.log(formatTimestamp(timestamp)) // 输出:2020-12-12 12:12:00 ``` > ✅ 支持毫秒级时间戳(13),如果是秒级时间戳(10),需要乘以 1000: > > ```js > const msTimestamp = secondsTimestamp * 1000 > ``` --- ### 🔍 代码解释 | 方法 | 说明 | |------|------| | `new Date(timestamp)` | 创建日期对象 | | `.getMonth() + 1` | 月份是从 0 开始的,所以要加 1 | | `.padStart(2, '0')` | 补零,确保 `9` → `09` | --- ### ✅ 方法二:封装成通用工具函数(支持字符串/数字时间戳) ```js function formatTime(time, format = 'YYYY-MM-DD HH:mm:ss') { const date = typeof time === 'string' || typeof time === 'number' ? new Date(time) : time if (isNaN(date.getTime())) { throw new Error('Invalid date or timestamp') } const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') const hour = String(date.getHours()).padStart(2, '0') const minute = String(date.getMinutes()).padStart(2, '0') const second = String(date.getSeconds()).padStart(2, '0') return format .replace('YYYY', year) .replace('MM', month) .replace('DD', day) .replace('HH', hour) .replace('mm', minute) .replace('ss', second) } ``` #### 🧪 示例使用: ```js console.log(formatTime(1607755920000)) // 2020-12-12 12:12:00 console.log(formatTime('2020-12-12T12:12:00')) // 2020-12-12 12:12:00 ``` --- ### ✅ 方法三:使用轻量级库 [Day.js](https://day.js.org/)(推荐) 安装: ```bash npm install dayjs ``` 使用: ```js import dayjs from 'dayjs' const formatted = dayjs(1607755920000).format('YYYY-MM-DD HH:mm:ss') console.log(formatted) // 2020-12-12 12:12:00 ``` > 💡 Day.js 体积小、API 类似 moment.js、性能好,非常适合前端项目。 --- ### ⚠️ 注意事项 - 时间戳单是 **毫秒**(JavaScript 默认) - 如果你拿到的是 **秒级时间戳**(例如后端返回的 Unix 时间戳),记得 ×1000: ```js const ms = seconds => seconds * 1000 dayjs(ms(1607755920)).format('YYYY-MM-DD HH:mm:ss') ``` - 浏览器显示时间基于本地时区,若需 UTC 时间,请使用 `.utc()` 或手动调整。 --- ### ✅ 扩展:UTC 时间处理(避免时区偏差) ```js function formatTimestampUTC(timestamp) { const date = new Date(timestamp) return ( date.getUTCFullYear() + '-' + String(date.getUTCMonth() + 1).padStart(2, '0') + '-' + String(date.getUTCDate()).padStart(2, '0') + ' ' + String(date.getUTCHours()).padStart(2, '0') + ':' + String(date.getUTCMinutes()).padStart(2, '0') + ':' + String(date.getUTCSeconds()).padStart(2, '0') ) } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值