Community
    • Login

    Replace Unix timestamp

    Scheduled Pinned Locked Moved General Discussion
    unixtimestampreadable
    11 Posts 7 Posters 2.4k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • PeterJonesP
      PeterJones @Dr. N
      last edited by

      @Dr-N ,

      It takes math to convert from unix timestamp to actual date and time. Notepad++ search and replace doesn’t do math.

      See our FAQ for more, including plugins that might help you implement the math.

      https://community.notepad-plus-plus.org/topic/23170/faq-can-i-do-a-mathematical-replacement

      rdipardoR 1 Reply Last reply Reply Quote 0
      • rdipardoR
        rdipardo @PeterJones
        last edited by rdipardo

        @PeterJones said in Replace Unix timestamp:

        Notepad++ search and replace doesn’t do math.

        True. Fortunately any scripting language can, and every PC at least has PowerShell pre-installed. So you could save a script like this, then have N++ run it by pressing F5 and filling in the box with:

        powershell %USERPROFILE%\epoch_to_date.ps1 $(CURRENT_WORD) $(FULL_CURRENT_PATH)
        

        where $(FULL_CURRENT_PATH) is the active file (must be saved to disk first, not new #), and $(CURRENT_WORD) is a Unix timestamp that’s under the caret:

        # %UserProfile%\epoch_to_date.ps1
        <#
        .SYNOPSIS
            Coverts all occurrences of a Unix timestamp to a calendar date in a given file.
        .PARAMETER UnixEpoch
            A Unix timestamp.
        .PARAMETER OutFile
           Full path to the file to process.
        .EXAMPLE
            PS C:\> ./epoch_to_date.ps1 1704393593 C:\file.txt
        #>
        param(
          [Int64]$UnixEpoch = 0L,
          [string]$OutFile
        )
        $WindowsTime=($UnixEpoch*10000000)+116444736000000000
        $Date=[datetime]::FromFileTimeUtc($WindowsTime)
        
        (Get-Content -Path $OutFile) -Replace $UnixEpoch.ToString(), $Date | Set-Content -Path $OutFile
        

        run-dialog.png

        run-dialog-after-execute.png

        run-dialog-reloaded.png

        rdipardoR 1 Reply Last reply Reply Quote 1
        • rdipardoR
          rdipardo @rdipardo
          last edited by

          P.S.
          I should have mentioned that — since version 7.7 — reloaded files cannot be restored by SCI_UNDO (CTRL+Z, Edit > Undo, etc.).

          @Dr-N, you would do better to wait till someone posts the obligatory Python script.

          1 Reply Last reply Reply Quote 2
          • CoisesC
            Coises @Dr. N
            last edited by Coises

            @Dr-N said in Replace Unix timestamp:

            How can a 13 digit unix timestamp be replaced with a readable time with Find and Replace?

            I believe you can do this with the MultiReplace plugin.

            This appeared to work when I tried it:

            Find what: (time=)(\d{13})
            Replace with: set(CAP1..os.date("%c",CAP2/1000+os.time({year=1970,month=1,day=1})))

            but I’ll leave it to @Thomas-Knoefel, the author of the plugin, to clarify the finer points, which I might have all mixed up. The plugin uses Lua expressions; I found the date and time functions described here. It should be possible to format the date/time from the timestamp as desired using the first argument of os.date. The os.time function is there to adjust the epoch from Unix to Windows, and the division by 1000 is because Lua’s time/date functions work in seconds but Unix timestamps are in milliseconds.

            Thomas KnoefelT 1 Reply Last reply Reply Quote 2
            • Mark OlsonM
              Mark Olson
              last edited by Mark Olson

              This PythonScript solution should work fine

              '''
              requires PythonScript: https://github.com/bruderstein/PythonScript/releases
              docs: https://docs.python.org/3/library/datetime.html 
              ref: https://community.notepad-plus-plus.org/topic/25308/replace-unix-timestamp/5
              '''
              # needed if using print() in Python 2
              from __future__ import print_function
              import datetime
              from Npp import editor
              
              THING_PRECEDING_TIMESTAMPS = '^time='
              # see https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
              #     for docs on this time format
              TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
              PATTERN_TO_REPLACE = r'(%s)(\d{13})' % (THING_PRECEDING_TIMESTAMPS,)
              
              def timestamp_str_to_date(timestamp_str, time_format=TIME_FORMAT):
                  '''converts a 13-digit timestamp string into a
                  date string in the desired format (default YYYY-MM-DD hh:mm:ss)
                  '''
                  timestamp = float(timestamp_str) / 1000
                  dt = datetime.datetime.fromtimestamp(timestamp)
                  # print(dt)
                  return dt.strftime(time_format)
              
              
              editor.rereplace(PATTERN_TO_REPLACE,
                  lambda m: m.group(1) + timestamp_str_to_date(m.group(2)))
              
              1 Reply Last reply Reply Quote 2
              • Mark OlsonM Mark Olson referenced this topic on
              • Thomas KnoefelT
                Thomas Knoefel @Coises
                last edited by Thomas Knoefel

                @Dr-N
                @Coises, said in Replace Unix timestamp:

                I believe you can do this with the MultiReplace plugin.

                I did converted the timestamp into a readable format with MultiReplace close to @Coises solution:

                Time to be converted: time=1704393593000
                Find what: (time=)(\d{13})
                Replace with: set(CAP1..os.date("%c", math.floor(CAP2/1000)))
                Result is: time=Thu Jan 4 19:39:53 2024

                Time to be converted: time=1704393593
                Find what: (time=)(\d{10})
                Replace with: set(CAP1..os.date("%Y-%m-%d %H:%M:%S", CAP2))
                Result is: time=2024-01-04 19:39:53

                You have to enable the Options “Use Variables” and “Regex” in MultiReplace.

                Dr. ND 1 Reply Last reply Reply Quote 3
                • guy038G
                  guy038
                  last edited by guy038

                  Hello, @dr-n, @peterjones, @rdipardo, @coises, @mark-olson, @thomas-knoefel and All,

                  @thomas-knoefel, I think that your result 2024-01-04 19:39:53 exceeds the right answer of one hour !

                  Indeed, for the Unix datestamp 1704393593, expressed in seconds, the correct result is 2024-01-04 18:39:53

                  Note that it is the @rdipardo result !

                  You can verify my assumption with the 3 on-line converters, below :

                  https://www.unixtimestamp.com/

                  https://unixtime.org/

                  https://www.epochconverter.com/


                  Remark :

                  • When using the first two sites, if you do the reverse operation ( Date to Epoch timestamp ), you must use the time indicated in the row Your time zone in order to get the correct number 1704393593

                  Best Regards,

                  guy038

                  Thomas KnoefelT 1 Reply Last reply Reply Quote 2
                  • Dr. ND
                    Dr. N @Thomas Knoefel
                    last edited by

                    @Thomas-Knoefel said in Replace Unix timestamp:

                    set(CAP1…os.date(“%c”, math.floor(CAP2/1000)))

                    Thanks Thomas…

                    Replacing the 13 digit unix timestamp showed this error, see picture.
                    2024-01-05_215327.jpg

                    Thomas KnoefelT 1 Reply Last reply Reply Quote 0
                    • Thomas KnoefelT
                      Thomas Knoefel @Dr. N
                      last edited by Thomas Knoefel

                      @Dr-N said in Replace Unix timestamp:

                      Replacing the 13 digit unix timestamp showed this error, see picture.

                      My example, was designed for two capture groups. In regex, capture groups are enclosed in parentheses. In MultiReplace, they are captured in the numbered CAP variables.
                      As you have only one capture group in your Find, which holds the timestamp, the second capture group (CAP2) is empty, as indicated by nil.

                      My previous example:
                      String to search for: time=1704393593000
                      Find what: (time=)(\d{13})
                      CAP1 = ‘time=’
                      CAP2 = 13 digit timestamp
                      Replace with: set(CAP1..os.date(“%c”, math.floor(CAP2/1000)))

                      you probably changed it to that:
                      String to search for: 1704393593000
                      Find what: (\d{13})
                      CAP1 = 13 digit timestamp
                      for that the replace phrase should look like this
                      Replace with: set(os.date("%c", math.floor(CAP1/1000)))

                      You can find more details here:
                      MultiReplace “Use Variables” manual

                      I hope this helps …

                      1 Reply Last reply Reply Quote 1
                      • Thomas KnoefelT
                        Thomas Knoefel @guy038
                        last edited by Thomas Knoefel

                        @Dr-N ,@Coises ,@PeterJones
                        @guy038 said in Replace Unix timestamp:

                        I think that your result 2024-01-04 19:39:53 exceeds the right answer of one hour !

                        Thanks for pointing this out!

                        Indeed, in my example, my local time zone has been automatically included into the calculation.
                        In case it should be UTC ( which is one hour west of my location) this should be indicated by a “!” in the format string.
                        So the Replace of my (two) Cature Group example should look like this .

                        Previous example with local time zone (Thu Jan 4 19:39:53 2024):
                        set(CAP1..os.date("%c", math.floor(CAP2/1000)))

                        New example with UTC time (Thu Jan 4 18:39:53 2024):
                        set(CAP1..os.date("!%c", math.floor(CAP2/1000)))

                        Details are described here:
                        Lua os.date description

                        1 Reply Last reply Reply Quote 4
                        • First post
                          Last post
                        The Community of users of the Notepad++ text editor.
                        Powered by NodeBB | Contributors