jsrosetta

Thư viện chuẩn

Ngày giờ (Date/Time)

Date và Intl.DateTimeFormat của Node.js so với time.Time bất biến của Go, chrono (Rust), Date của Swift và java.time (Java): parse, cộng ngày và format.

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.20Rust ≥ 1.62Swift ≥ 5.5Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Node.js biểu diễn thời điểm bằng Date — một object có thể mutate qua các hàm set*. Go dùng time.Time, một struct bất biến: mọi phép cộng/trừ đều trả về giá trị time.Time mới thay vì sửa tại chỗ. Rust không có kiểu ngày giờ nào biết lịch trong std, nên phải dùng crate ngoài (chrono). Swift dùng Date của Foundation (một mốc thời gian đơn thuần) cộng với Calendar để cộng/trừ theo lịch. Java dùng java.time — cũng bất biến như Go. Cách format cũng khác hẳn giữa các ngôn ngữ: Node.js và Java dùng tên field/pattern, Go dùng "ngày tham chiếu" 2006-01-02 làm layout, Rust dùng specifier kiểu strftime, còn Swift dùng FormatStyle — một builder có thể chain (.dateTime.year().month()...) — chứ không phải strftime.

Parse, cộng ngày và format

const nowUnix = Date.now() // mili-giây kể từ epoch
console.log(nowUnix)
 
const datestr = '2019-01-17T09:24:23+00:00'
const date = new Date(datestr)
console.log(date.getTime()) // mili-giây
console.log(date.toString()) // theo timezone của máy
 
const futureDate = new Date(date)
futureDate.setDate(date.getDate() + 14) // mutate tại chỗ
console.log(futureDate.toString())
 
const formatted = new Intl.DateTimeFormat('en-US', {
  year: 'numeric',
  month: '2-digit',
  day: '2-digit',
}).format(date)
console.log(formatted) // 01/17/2019
# dòng đầu là timestamp hiện tại (phi tất định); các chuỗi ngày phụ thuộc
# timezone của máy chạy (ở đây TZ=Asia/Saigon)
$ node datetime.js
1790530769893
1547717063000
Thu Jan 17 2019 16:24:23 GMT+0700 (Indochina Time)
Thu Jan 31 2019 16:24:23 GMT+0700 (Indochina Time)
01/17/2019
 
$ go run datetime.go
1790530770
1547717063
2019-01-17 09:24:23 +0000 +0000
2019-01-31 09:24:23 +0000 +0000
2019-01-31
01/17/2019
 
$ cargo run -q
1790532152
1547717063
2019-01-17 09:24:23 +00:00
2019-01-31 09:24:23 +00:00
01/17/2019
 
$ swift main.swift
1790532172
1547717063
2019-01-17 09:24:23 +0000
2019-01-31 09:24:23 +0000
01/17/2019
 
$ java Main.java
1790532161
1547717063
2019-01-17T09:24:23Z
2019-01-31T09:24:23Z
01/17/2019

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#datetime