javascriptunixepoch

Epoch class functionality


I am trying to make JavaScript code where I can put a <span class="epoch>(unix timestamp)</span> and it will set it to the timestamp in the user's timezone.

So far I have this code:

let epoch = document.getElementsByClassName("epoch");
for (var i = 0; i < epoch.length; i++) {
    let d = new Date(parseInt(epoch.item(i))).toDateString({ weekday: 'long', year: 'numeric', month: 'short', day: 'numeric' });
    epoch.item(i).innerText = d;
}

I tried replacing epoch.item(i).innerText = d; with alert(d); but that still didn't work.

HTML (not full version but still has the same things):

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Mesure73L</title>
  <link href="index.css?v=1" rel="stylesheet" type="text/css" />
  <script src="index.js?v=1" defer></script>
  <script src="https://mesure.x10.mx/public_assets/main.js?v=1" defer></script>
  <script id="mobile_navbar"></script>
  <link rel="icon" type="image/x-icon" href="favicon.png">
</head>

<body>
  <script id="replace_with_navbar" src="https://mesure.x10.mx/public_assets/navbar.js?v=1"></script>
  <div id="content">
    <p><span id="epoch">1700523189</span></p>
  </div>
</body>

</html>

Solution

  • Original Answer

    There are a few things to correct and improve in your JavaScript code to achieve the functionality you're looking for.

    1. Typo in getElementsByClassName: The method name should be getElementsByClassName (plural) instead of getElementByClassName (singular).

    2. Parsing the Timestamp: The parseInt function should be called with the innerText of the epoch element to convert the epoch timestamp string to a number.

    3. Date Formatting: The toDateString method doesn't accept any arguments. To format the date, you should use toLocaleDateString instead, which allows specifying formatting options.

    4. You are using an ID as epoch and calling a Class.

    let epochs = document.getElementsByClassName("epoch");
    for (var i = 0; i < epochs.length; i++) {
        let timestamp = parseInt(epochs[i].innerText, 10);
        let date = new Date(timestamp * 1000); // Convert to milliseconds
        let formattedDate = date.toLocaleDateString(undefined, { 
            weekday: 'long', 
            year: 'numeric', 
            month: 'short', 
            day: 'numeric', 
            hour: '2-digit', 
            minute: '2-digit', 
            second: '2-digit', 
            timeZoneName: 'short' 
        });
        epochs[i].innerText = formattedDate;
    }
    

    Explanation:

    JSFiddle Link: https://jsfiddle.net/Termato/d1ytopuq/1/


    Updated:

    Use the following code:

    <span class="epoch">(epoch timestamp)</span>
    

    And then for the JavaScript:

     window.onload = function() {
        // Get the current timestamp in seconds
        var milliseconds = new Date().getTime();
    
        // Create a Date object from the current timestamp
        let date = new Date(milliseconds * 1000);
    
        // Find the span element and set its content
        let epochSpan = document.querySelector('.epoch');
        if (epochSpan) {
            epochSpan.innerText = date;
        }
    };
    

    You can see the JSFiddle Here: https://jsfiddle.net/Termato/hr7ytf1p/5/

    In your question, you reference a Class but in your code epoch is an ID. This wont work. Either make <span class="epoch"> OR change the javascript to target the ID: document.querySelector('#epoch');

    See this JS Fiddle for example: https://jsfiddle.net/Termato/zmcaoxb9/2/