• Login
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.
  • D
    Dr. N
    last edited by Jan 4, 2024, 4:46 PM

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

    P C 2 Replies Last reply Jan 4, 2024, 5:31 PM Reply Quote 1
    • P
      PeterJones @Dr. N
      last edited by Jan 4, 2024, 5:31 PM

      @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

      R 1 Reply Last reply Jan 4, 2024, 7:18 PM Reply Quote 0
      • R
        rdipardo @PeterJones
        last edited by rdipardo Jan 4, 2024, 8:05 PM Jan 4, 2024, 7:18 PM

        @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

        R 1 Reply Last reply Jan 4, 2024, 8:12 PM Reply Quote 1
        • R
          rdipardo @rdipardo
          last edited by Jan 4, 2024, 8:12 PM

          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
          • C
            Coises @Dr. N
            last edited by Coises Jan 4, 2024, 11:00 PM Jan 4, 2024, 10:03 PM

            @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.

            T 1 Reply Last reply Jan 4, 2024, 11:50 PM Reply Quote 2
            • M
              Mark Olson
              last edited by Mark Olson Jan 5, 2024, 12:04 AM Jan 4, 2024, 10:42 PM

              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
              • M Mark Olson referenced this topic on Jan 4, 2024, 10:42 PM
              • T
                Thomas Knoefel @Coises
                last edited by Thomas Knoefel Jan 5, 2024, 12:51 AM Jan 4, 2024, 11:50 PM

                @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.

                D 1 Reply Last reply Jan 5, 2024, 2:58 PM Reply Quote 3
                • G
                  guy038
                  last edited by guy038 Jan 5, 2024, 2:54 PM Jan 5, 2024, 2:52 PM

                  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

                  T 1 Reply Last reply Jan 8, 2024, 9:54 AM Reply Quote 2
                  • D
                    Dr. N @Thomas Knoefel
                    last edited by Jan 5, 2024, 2:58 PM

                    @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

                    T 1 Reply Last reply Jan 8, 2024, 9:14 AM Reply Quote 0
                    • T
                      Thomas Knoefel @Dr. N
                      last edited by Thomas Knoefel Jan 8, 2024, 11:25 AM Jan 8, 2024, 9:14 AM

                      @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
                      • T
                        Thomas Knoefel @guy038
                        last edited by Thomas Knoefel Jan 8, 2024, 10:52 AM Jan 8, 2024, 9:54 AM

                        @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
                        6 out of 11
                        • First post
                          6/11
                          Last post
                        The Community of users of the Notepad++ text editor.
                        Powered by NodeBB | Contributors