diff --git a/src/io.F90 b/src/io.F90
index c602af2..09576f7 100644
--- a/src/io.F90
+++ b/src/io.F90
@@ -57,17 +57,22 @@ module io
 !   nrest   - for job restarting, this is the number of restart snapshot;
 !   irest   - the local counter for the restart snapshots;
 !   isnap   - the local counter for the regular snapshots;
+!   ishift  - the shift of the snapshot counter for restarting job with
+!             different snapshot interval;
 !   hrest   - the execution time interval for restart snapshot storing
 !             (in hours); the minimum allowed value is 3 minutes;
 !   hsnap   - the problem time interval for regular snapshot storing;
+!   tsnap   - the next snapshot time;
 !
   character(len=255), save :: respath     = "./"
   character         , save :: ftype       = "p"
   integer           , save :: nrest       = -1
   integer(kind=4)   , save :: irest       =  1
-  integer(kind=4)   , save :: isnap       = -1
+  integer(kind=4)   , save :: isnap       =  0
+  integer(kind=4)   , save :: ishift      =  0
   real              , save :: hrest       =  6.0e+00
-  real              , save :: hsnap       =  1.0d+00
+  real              , save :: hsnap       =  1.0e+00
+  real              , save :: tsnap       =  0.0e+00
 
 ! flags to determine the way of data writing
 !
@@ -283,9 +288,10 @@ module io
     call read_restart_snapshot_h5()
 #endif /* HDF5 */
 
-! calculate the next snapshot number
+! calculate the shift of the snapshot counter, and the next snapshot time
 !
-    isnap = int(time / hsnap)
+    ishift = int(time / hsnap) - isnap + 1
+    tsnap  = (ishift + isnap) * hsnap
 
 #ifdef PROFILE
 ! stop accounting time for the data reading
@@ -327,7 +333,7 @@ module io
 !
 !-------------------------------------------------------------------------------
 !
-! check if the condition for storing the restart snapshot has been met
+! check if conditions for storing the restart snapshot have been met
 !
     if (hrest < 5.0e-02 .or. thrs < irest * hrest) return
 
@@ -381,9 +387,9 @@ module io
 !
 !-------------------------------------------------------------------------------
 !
-! exit the subroutine, if the time of the next snapshot is not reached
+! check if conditions for storing the regular snapshot have been met
 !
-    if (hsnap <= 0.0d+00 .or. isnap >= (int(time / hsnap))) return
+    if (hsnap <= 0.0e+00 .or. time < tsnap) return
 
 #ifdef PROFILE
 ! start accounting time for the data writing
@@ -391,16 +397,17 @@ module io
     call start_timer(iow)
 #endif /* PROFILE */
 
-! increase the file counter
-!
-    isnap = isnap + 1
-
 #ifdef HDF5
 ! store variable snapshot file
 !
     call write_snapshot_h5()
 #endif /* HDF5 */
 
+! increase the snapshot counter and calculate the next snapshot time
+!
+    isnap = isnap + 1
+    tsnap = (ishift + isnap) * hsnap
+
 #ifdef PROFILE
 ! stop accounting time for the data writing
 !
@@ -430,7 +437,7 @@ module io
 !-------------------------------------------------------------------------------
 !
     if (hsnap > 0.0d+00) then
-      next_tout = (isnap + 1) * hsnap
+      next_tout = tsnap
     else
       next_tout = huge(hsnap)
     end if
@@ -1092,6 +1099,7 @@ module io
       call write_attribute_integer_h5(gid, 'nproc'  , nproc)
       call write_attribute_integer_h5(gid, 'nseeds' , nseeds)
       call write_attribute_integer_h5(gid, 'step'   , step  )
+      call write_attribute_integer_h5(gid, 'isnap'  , isnap )
 
 ! store the real attributes
 !
@@ -1317,6 +1325,8 @@ module io
               end if
             case('step')
               call read_attribute_integer_h5(aid, aname, step)
+            case('isnap')
+              call read_attribute_integer_h5(aid, aname, isnap)
             case('time')
               call read_attribute_double_h5(aid, aname, time)
             case('dt')