4 điểm bởi GN⁺ 2023-10-15 | 3 bình luận | Chia sẻ qua WhatsApp
  • Nhãn ngày tương đối trong web UI trông giống cách con người nói, nhưng thường không khớp với cách người dùng thực sự hình dung về ngày tháng
  • Với con người, “yesterday” là ngày liền trước hôm nay từ 0:00 đến 23:59, chứ không đơn thuần là “ít hơn 24 giờ”
  • Nếu mỗi cách triển khai dùng một tiêu chuẩn khác nhau, thì ngay trong cùng một dịch vụ, cách hiển thị “yesterday” cũng sẽ thiếu nhất quán, làm giảm độ tin cậy của việc hiển thị ngày tháng
  • Cách chỉ hiển thị số ngày đã qua như “12 days ago” tạo cảm giác xa rời cách con người tự nhiên cảm nhận về thời gian
  • “last week/month/year” cũng có phạm vi rộng và mơ hồ, nên với các mục cũ hơn hôm qua, hiển thị ngày cụ thể sẽ rõ ràng hơn

Vì sao nhãn ngày tương đối dễ gây bối rối

  • Những cách diễn đạt như “yesterday”, “2 days ago”, “a week ago” trông giống cách biểu đạt thời gian mang tính con người, nhưng lại không đủ chính xác để xác định ngày tháng thực tế
  • Đặc biệt, “yesterday” có một ý nghĩa rất rõ ràng theo kỳ vọng của người dùng
    • Nghĩa là ngày liền trước hôm nay
    • Chỉ khoảng thời gian từ 0:00 đến 23:59 của ngày hôm trước
    • Khác với công thức tính kiểu “ít hơn 24 giờ”
  • Máy tính có thể triển khai cách tính “yesterday” theo nhiều cách khác nhau, và nếu cách hiển thị thay đổi ngay trong cùng một dịch vụ, người dùng sẽ bớt tin vào thông tin ngày tháng hơn

Với các mục cũ hơn, hiển thị bằng ngày tháng sẽ tốt hơn

  • Những cách diễn đạt như “12 days ago” không thật sự khớp với đơn vị thời gian mà con người thường nghĩ đến
  • “last week”, “last month”, “last year” cũng có phạm vi rộng nên vẫn để lại sự mơ hồ
  • Với các mục cũ hơn hôm qua, thay vì dùng cách diễn đạt tương đối, hiển thị ngày cụ thể sẽ dễ đọc và đáng tin hơn

3 bình luận

 
cosine20 2024-12-02

GitHub thật sự cũng vậy, YouTube cũng vậy, tôi cực kỳ ghét kiểu hiển thị như vài tháng trước, vài năm trước. Như ý kiến trên HN bên dưới cũng nói, có khi ghi là 1 năm trước nhưng thực ra đã là 1 năm rưỡi rồi, rất mơ hồ.

 
budlebee 2023-10-17

Cái này đúng là rất đồng cảm. Ở góc độ người làm ra sản phẩm thì nếu hiển thị kiểu “xx ngày trước” sẽ không phải bận tâm đến các cách ghi ngày tháng khác nhau theo từng quốc gia như YY.MM.DD hay mmddyyyy, nhưng cá nhân tôi vẫn thấy hiển thị ngày tháng sẽ tốt hơn là “xx ngày trước”.

 
GN⁺ 2023-10-15
Ý kiến trên Hacker News
  • Đặc biệt, hiển thị thời gian tương đối trở nên quá thiếu chính xác
    Trên YouTube, “1 năm trước” có thể là bất cứ lúc nào từ 365 ngày trước đến 729 ngày trước
    Muốn biết trong hai video đều hiển thị “1 năm trước” thì video nào gần đây hơn, thực tế phải mở video rồi vào phần mô tả để xem ngày

    • Cảm giác như các nhà thiết kế UI đã tụ họp mở một cuộc thi vi công kích GUI để hành hạ người dùng, và xu hướng “N ngày trước” thắng cuộc rồi lan ra everywhere
      Vì không muốn tính ngày trong đầu, chỉ cần hiển thị timestamp chính xác là được
      Đừng vứt bỏ thông tin trong một khoảng lớn kiểu “1 năm trước”, mà hãy hiển thị thời gian thực tế
    • Điều thú vị hơn là mỗi trang lại có quy tắc làm tròn khác nhau
      “1 năm trước” của YouTube có thể là 365–729 ngày trước, nhưng có trang lại làm tròn theo đơn vị năm gần nhất, nghĩa là 183–548 ngày trước; trang khác thì làm tròn theo tháng đến 11 tháng, rồi coi 350–548 ngày trước là “1 năm trước”
      Có nơi khác lại dùng tiêu chí kiểu “trong năm dương lịch trước”, khiến khoảng này có thể từ 1–365 ngày trước đến cả 364–729 ngày trước
    • Hiện là tháng 10/2023, nên một video đăng vào tháng 11/2021 không được hiển thị là “1 năm trước”, mà phải là “gần 2 năm trước
    • Ngay cả cùng một ngày, nếu thời điểm muộn hơn thì sẽ bị làm tròn xuống
      Một video đăng ngày 14/10/2021 dù đã là 2 năm trước, nhưng nếu được tải lên vào thời điểm muộn hơn trong ngày đó thì vẫn có thể hiển thị là 1 năm trước
    • Có thể giảm độ thiếu chính xác bằng cách tránh để con số đầu tiên là 1 và chuyển sang đơn vị nhỏ hơn
      Ví dụ hiển thị đến 120 giây trước, đến 120 phút trước, đến 48 giờ trước, đến khoảng 61 ngày trước, rồi sau đó đến 24 tháng trước
      Ngày tương đối trong danh sách nói chung còn chịu được, nhưng vấn đề không được cập nhật còn khó chịu hơn nhiều, và giới hạn chỉ đến “hôm qua” cũng không giải quyết được
  • Tôi muốn khuyến nghị điều này mạnh mẽ hơn nữa
    May là timestamp thường hiện dưới dạng tooltip
    Ví dụ khi xem phiên bản gói npm, nó hiện kiểu “version 5.3.27 was released ‘about a year ago’”, thấy như mất trí vậy
    Tôi đang cố nắm thứ tự phát hành của các gói cũ để lập một bộ phiên bản gói cố định tương thích, nhưng 20 gói liên tiếp đều hiển thị “khoảng 1 năm trước”, nên phải mở tooltip từng cái để kiểm tra xem có phải bản gần đây không
    Kiểu thiết kế này đã vượt quá giới hạn, và trông cùng một loại với những người tạo ORM ánh xạ tên bảng số ít/số nhiều bất quy tắc

    • Hóa ra YouTube thật sự cũng có tooltip
      Không hiểu sao trước giờ tôi không biết, và nó khá hữu ích
    • Không phải mất trí, mà chỉ là ngu ngốc, hoặc nói nhẹ thì là thiếu hiểu biết đến mức bất tài
    • Những người làm trò này trong công cụ dành cho lập trình viên thì bất tài ở mức tội phạm
      Điều đáng kinh ngạc là những người đó không chỉ vẫn còn được tuyển dụng, mà cách làm ngu ngốc này còn lan ra everywhere, từ npm đến GitHub rồi CircleCI
  • Xa hơn nữa, tôi muốn loại bỏ hẳn các timestamp tương đối đã làm tròn kiểu này
    Ứng dụng Mail trên iOS đặc biệt gây bực mình
    Mở lên thì nó hiện “vừa cập nhật”, nhưng kéo để làm mới thì một email chưa đọc nhận từ 2 giờ trước bỗng nhiên xuất hiện
    Chỉ cần hiển thị thời gian chính xác lúc cập nhật là được

    • Timestamp ngu ngốc trong thông báo còn tệ hơn
      Nếu không xem trong vòng một giờ, nó lập tức trở nên thiếu chính xác và chỉ còn thấy “1 giờ trước” hay “2 giờ trước”
      Có thể có lúc nhất thiết phải biết một thông báo đến chính xác lúc nào, nhưng hoàn toàn không có cách kiểm tra
      Chỉ cần hiển thị giờ là được, giờ thì tôi đọc được
    • Một trong những điểm hay của Thunderbird là nó vẫn hiển thị ngày và giờ chính xác
      Nếu là hôm nay thì chỉ hiển thị giờ, còn ngoài ra thì hiển thị đầy đủ ngày và giờ
  • Nếu dùng thời gian tuyệt đối, trình duyệt có thể hiển thị theo định dạng người dùng ưa thích
    https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...

    • Giấc mơ của web, nơi server chỉ gửi dữ liệu còn client chọn cách hiển thị, đã chết hoàn toàn
      Các nhà thiết kế web muốn trang có hình dạng cụ thể đến từng pixel, và quyền kiểm soát hiển thị phía client cản trở điều đó
      Vẫn có thể làm được, nhưng website sẽ không được thiết kế cho mục đích đó hoặc chủ động hỗ trợ việc đó
    • Không rõ người dùng trung bình thực sự sẽ thấy như thế nào
      Trong ví dụ, đầu ra iOS/Safari trông như không có thẻ vậy
  • Điều đặc biệt bất tiện ở cách hiển thị ngày tháng mơ hồ là khi thứ trong tuần mới là thông tin quan trọng nhất
    Ví dụ khi xem lịch sử GitLab, biết một thay đổi được merge vào thứ Sáu hữu ích hơn nhiều so với “tuần trước” hay “2 ngày trước”
    Với lịch sử chat cũng vậy, nếu gần ranh giới giữa các tháng thì việc cuộc trò chuyện diễn ra trước hay sau đầu tháng có thể rất quan trọng
    Trong các trường hợp khác, cá nhân tôi vẫn thích ngày chính xác hơn là biết 4 tuần trước hay 2 tháng trước, và việc đưa ra ngày chính xác cũng không làm giảm lượng thông tin
    Khó mà tưởng tượng được tình huống nào ngày tháng mơ hồ lại hữu ích hơn ngày chính xác

    • Tôi là thành viên nhóm GitLab
      Trong GitLab, nếu đổi thiết lập thì có thể dùng thời gian tuyệt đối thay cho thời gian tương đối
      Ví dụ: October 14, 2023 11:51AM
      https://docs.gitlab.com/ee/user/profile/preferences.html#sho...
    • Tôi đã viết một script Greasemonkey để đổi các nhãn thời gian vô dụng của Jira thành ngày đầy đủ có kèm thứ trong tuần
      Rất khuyến nghị áp dụng những thứ như vậy cho các phần mềm nền web bạn dùng thường xuyên
    • Trong những trường hợp rất đặc thù, ngày tháng mơ hồ có thể hữu ích
      Có một ứng dụng lấy thông tin từ cơ sở dữ liệu khác, định dạng lại rồi hiển thị cho người dùng; chi phí cập nhật lớn và mất thời gian nên người dùng phải tự chạy thủ công khi cần
      Trong trường hợp này, thời điểm chính xác của lần cập nhật cuối không quan trọng lắm; điều quan trọng là dữ liệu đã cũ đến mức nào, tức khả năng nó đã lệch so với nguồn gốc là bao nhiêu
      Một số thông tin chỉ vài giờ là đã cần refresh, nhưng một số thông tin dù cũ hơn 4–5 ngày vẫn ổn nên không cần chạy cập nhật có thể mất tới 10 phút
      Với mục đích này, hiển thị độ cũ xấp xỉ hữu ích hơn thời điểm cập nhật cuối, và người dùng không cần tự so sánh với thời gian hiện tại để tính toán
      Tuy vậy đây là trường hợp hiếm, còn đa số thì ngày tháng tương đối mơ hồ kém hữu ích hơn
    • Khi truyền đạt thời điểm trong tương lai gần cho những người ở nhiều múi giờ, thời gian tương đối rất hữu ích
      Kiểu như “kết thúc khoảng 4–5 tiếng sau bình luận này”, “đã sửa và sẽ bắt đầu lần chạy tiếp theo khoảng 15 tiếng sau bình luận này”
  • Trong các ứng dụng tôi dùng hiển thị timestamp sai cách, tệ nhất là gitg
    Xem ảnh chụp màn hình này là rõ
    https://ubunlog.com/wp-content/uploads/2018/06/git-gui-gitg....
    Nhiều commit được hiển thị là “3 ngày trước”, chỉ khá hơn một chút so với không có thông tin gì
    Không thể biết đó là buổi sáng hay buổi chiều, các commit dồn trong vòng một giờ hay trải đều cả ngày
    Khi không ghi lại được thời gian làm việc cho khách hàng và phải ước tính sau một tuần, những thông tin như vậy rất quan trọng, nên tôi phải bấm từng commit và kiểm tra timestamp ở phía đối diện màn hình

    • Ảnh chụp màn hình là một trong những lý do quan trọng cho thấy luôn cần hiển thị ngày đầy đủ
    • Outlook webmail cũng khá tệ
      Không chỉ hiển thị “vài ngày trước”, nó còn cố đưa lên trên các mục mà nó tự cho là quan trọng
      Kết quả là hai danh sách có một phần trùng lặp bị trộn vào nhau, mức kinh khủng tăng gấp đôi
    • Timestamp của git được đặt theo múi giờ cục bộ của từng lập trình viên và không được xác minh, nên trong phát triển toàn cầu chuyện này có thể còn khó hơn
      https://alesnosek.com/blog/2017/01/02/git-getting-the-timing...
    • Thật ngạc nhiên là dường như không có cách thiết lập để gitg luôn hiển thị đầy đủ ngày và giờ
    • Cách hiển thị trong ảnh chụp màn hình mà có cơ quan quản lý ngành thì có lẽ đáng bị xem là ứng viên cho vi phạm nghiệp vụ chuyên môn
  • Cứ hiển thị cả hai là được
    “1 giờ trước (15:47)”
    “tuần trước (MON 12 SEP 9:20)”
    “2 năm trước (WED 14 APR 2021 11:47)”
    Định dạng ngày thì tùy sở thích

    • Ở frontend, cách render thời gian tương đối trên trang và đặt timestamp thực hoặc định dạng ngày trong tooltip tỏ ra hữu ích
      Ai muốn xem chi tiết hơn thì chỉ cần rê chuột lên ngày tương đối
    • Trước đây tôi đưa thông tin ngày/giờ chính xác vào tooltip vì nghĩ rằng “người dùng cần thì vẫn tìm được mà không làm UI quá tải”
      Vài năm sau, các cuộc phỏng vấn người dùng cho thấy chỉ gạch chân kiểu hyperlink thôi không khiến người dùng nghĩ “mình nên rê chuột vào đây”, nên tôi đã đảo ngược lại khá nhiều
      Giờ emoji và màn hình độ phân giải cao đã phổ biến, tôi tự hỏi liệu việc dùng một dấu hỏi hoặc biểu tượng kính lúp hơi nổi bật để làm gợi ý tooltip có đủ cho người dùng lớn tuổi hoặc ít thành thạo hơn không
    • Vì sao không chỉ hiển thị ngày thôi?
  • Cũng phải bao gồm cả năm
    Tôi đã quá nhiều lần gặp diễn đàn web chỉ hiển thị ngày bình luận kiểu “5 Jul”, rồi mãi sau mới nhận ra bình luận đó là bài từ nhiều năm trước
    Giờ tôi không còn tin ngày không có năm nữa, và nếu ngay từ đầu không thấy năm thì kiểu gì tôi cũng tìm cho ra

    • Năm phải viết 4 chữ số
      Có một diễn đàn tôi vào vài lần mỗi tuần, tồn tại 20–30 năm rồi, nên ngày tháng kiểu 08/11/02, 09/03/04 rất dễ gây nhầm lẫn
  • “1 năm trước” có thể chưa đủ chính xác, nhưng “11 tháng trước” thì thường là đủ
    Khi triển khai hàm kiểu này, tôi thường tránh con số 1
    Ví dụ hiển thị “6 ngày trước” thay vì “1 tuần trước”

  • Khi được lưu trữ ở những nơi như Google hoặc web.archive.org, nếu nhãn không được tính ở phía client thì thời gian tương đối có thể trở thành thời gian tính theo ngày lập chỉ mục
    Trong bản lưu trữ, JavaScript cũng rất có khả năng không hoạt động đúng
    Ngoài ra, để hiển thị ngày tháng dễ tiếp cận hơn, cũng đáng cân nhắc dùng thẻ time và thuộc tính datetime
    https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...
    Hiện tại trong trình duyệt nó chưa khác span là mấy, nhưng làm trang web tương thích tốt hơn với tương lai thì cũng chẳng hại gì