Cách chuyển đổi dấu thời gian unix sang lịch ngày khoảnh khắc.js


141

Tôi có dấu thời gian unix và tôi đang cố gắng chuyển đổi nó thành một ngày theo lịch như MM/DD/YYYY. Cho đến nay, tôi có điều này:

$(document).ready(function() {
  var value = $("#unixtime").val(); //this retrieves the unix timestamp
  var dateString = moment(value).calendar(); 
  alert(dateString);
});

Khi tôi cố in ra ngày dương lịch, cửa sổ thông báo "Ngày không hợp lệ". Bất cứ ai có thể giúp tôi ra?

Câu trả lời:


364

Sử dụng Moment.js như bạn đã hỏi, có một unixphương pháp chấp nhận dấu thời gian unix trong vài giây:

var dateString = moment.unix(value).format("MM/DD/YYYY");

3
Đó không phải là một ngày dương lịch.
Ian Warburton

1
@IanWarburton - không phải sao ??
Matt Johnson-Pint

Tôi cho rằng đó là theo câu hỏi. Nhưng tôi nghĩ một ngày theo lịch trong khoảnh khắc.js trông như thế này .... khoảnh khắc (Ngày mới (item.date)). Lịch ()
Ian Warburton

5
@IanWarburton - Bạn sẽ không cần đối tượng ngày mới ở đó. Các calendarchức năng là tốt đẹp ( tài liệu ở đây ), nhưng không phải trong định dạng mà OP yêu cầu.
Matt Johnson-Pint

1
Thật đáng chú ý tại sao câu hỏi thất bại nhưng điều này hoạt động. Lý do là bởi vì monent(number) mong đợi một dấu thời gian unix tính bằng mili giây (phù hợp với Dateđối tượng), trong khi dấu thời gian unix được tính theo giây theo mặc định. Vì vậy, bạn cũng có thể làm moment(value*1000)thay vì moment.unix(value), nhưng sử dụng unixthì rõ ràng hơn.
icc97

39

Dấu thời gian UNIX là số giây từ năm 1970, vì vậy bạn cần chuyển đổi nó thành đối tượng Ngày của JS:

var date = new Date(unixTimestamp*1000);

Vâng, đó là giải pháp với phiên bản mới nhất của khoảnh khắc, hoặc ít nhất là giải pháp tôi nhận được từ npm gần đây. mặc dù tôi đã nhận được .unix () từ lúc tôi phải * 1000 khi bắt đầu lại. ví dụ: khoảnh khắc (khoảnh khắc (). unix () * 1000)
kroe

Câu trả lời hay nhất so với logic của.j.j
Andris


4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()

9
Mặc dù mã này có thể trả lời câu hỏi, nhưng sẽ tốt hơn nếu bao gồm một số bối cảnh, giải thích cách thức hoạt động và mô tả khi nào nên sử dụng nó. Câu trả lời chỉ có mã là không hữu ích trong thời gian dài. Ngoài ra, mã của bạn không được định dạng đúng.
ryanyuyu


3

Có thể hơi muộn nhưng đối với các vấn đề mới như thế này tôi sử dụng mã này:

moment(timestamp, 'X').format('lll');

Bạn có thể thay đổi định dạng để phù hợp với nhu cầu của mình và cũng có thể thêm múi giờ như thế này:

moment(timestamp, 'X').tz(timezone).format('lll');

1
Đây là phương pháp tốt nhất tôi từng thấy ở đây.
LukeVenter

1
Chỉ cần thêm vào câu trả lời này (đó là câu trả lời đúng nhất ở đây). Sử dụng chữ thường xcho dấu thời gian unix ms. Tài liệu ở đây
JonTroncoso

0

Tôi đã sửa nó như ví dụ này.

$scope.myCalendar = new Date(myUnixDate*1000);
<input date-time ng-model="myCalendar" format="DD/MM/YYYY" />

0
$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment(value, 'MM/DD/YYYY', false).calendar(); 
    alert(dateString);
});

Có một chế độ nghiêm ngặtchế độ Tha thứ .

Mặc dù chế độ nghiêm ngặt hoạt động tốt hơn trong hầu hết các tình huống, chế độ tha thứ có thể rất hữu ích khi định dạng của chuỗi được truyền đến thời điểm có thể thay đổi.

Trong phiên bản mới hơn, trình phân tích cú pháp sẽ mặc định sử dụng chế độ nghiêm ngặt. Chế độ nghiêm ngặt yêu cầu đầu vào đến thời điểm khớp chính xác với định dạng đã chỉ định, bao gồm các dấu phân cách. Chế độ nghiêm ngặt được đặt bằng cách chuyển true thành tham số thứ ba cho hàm khoảnh khắc.

Một kịch bản phổ biến trong đó chế độ tha thứ hữu ích là trong các tình huống mà API của bên thứ ba đang cung cấp ngày và định dạng ngày cho API đó có thể thay đổi. Giả sử rằng API bắt đầu bằng cách gửi ngày ở định dạng 'YYYY-MM-DD', sau đó thay đổi thành định dạng 'MM / DD / YYYY'.

Trong chế độ nghiêm ngặt, đoạn mã sau dẫn đến 'Ngày không hợp lệ' được hiển thị:

moment('01/12/2016', 'YYYY-MM-DD', true).format()
"Invalid date"

Trong chế độ tha thứ bằng chuỗi định dạng, bạn nhận được một ngày sai:

moment('01/12/2016', 'YYYY-MM-DD').format()
"2001-12-20T00:00:00-06:00"

một cách khác sẽ là

$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment.unix(value).calendar(); 
    alert(dateString);
});

0

Hàm này tạo ngày từ dấu thời gian:

    function formatDateTime(dateString) {
        const parsed = moment(new Date(dateString))

        if (!parsed.isValid()) {
            return dateString
        }

        return parsed.format('MMM D, YYYY, HH:mmA')
    }

0
moment(1454521239279).toDate()
moment(1454521239279).format()

0
moment(timestamp).format('''any format''')

3
Mặc dù mã này có thể giải quyết vấn đề của OP, tốt nhất là bao gồm một lời giải thích về cách mã của bạn giải quyết vấn đề của OP. Theo cách này, khách truy cập trong tương lai có thể học hỏi từ bài đăng của bạn và áp dụng nó vào mã của riêng họ. SO không phải là một dịch vụ mã hóa, mà là một nguồn tài nguyên cho kiến ​​thức. Ngoài ra, chất lượng cao, câu trả lời đầy đủ có nhiều khả năng được nâng cao. Các tính năng này, cùng với yêu cầu tất cả các bài đăng đều khép kín, là một số điểm mạnh của SO như một nền tảng, phân biệt nó với các diễn đàn. Bạn có thể chỉnh sửa để thêm thông tin bổ sung & / hoặc để bổ sung giải thích của bạn với tài liệu nguồn.
ysf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.