code: public BucketEndPoints normalizeUnixTimeStamp(final long unixTimeStamp) {
          final TimeUnit timeUnit = config.getTimeUnit();
  
          // first get the time stamp in the unit of the time-series
          final long timeStamp = timeUnit.convert(unixTimeStamp, TimeUnit.SECONDS);
  
          /*
           * Now lets, normalize the time stamp regarding to the bucketSize:
           *  1.) we need the size of a bucket
           *  2.) we need where the current time stamp is located within the size,
           *      i.e., how much it reaches into the bucket (ratio => offset)
           *  3.) we use the calculated offset to determine the end points (in seconds)
           *
           *  Example:
           *    The time stamp 1002 (in minutes or seconds or ...?) should be mapped
           *    to a normalized bucket, so the bucket would be, e.g., [1000, 1005).
           */
          final int bucketSize = config.getBucketSize();
          final long offset = timeStamp % bucketSize;
          final long start = timeStamp - offset;
          final long end = start + config.getBucketSize();
  
          return new BucketEndPoints(TimeUnit.SECONDS.convert(start, timeUnit),
                  TimeUnit.SECONDS.convert(end, timeUnit));
      }
docs: This method is used to determine the bucket the {@code unixTimeStamp} belongs into. The bucket is represented by
  a {@link BucketEndPoints} instance, which defines the end-points of the bucket and provides methods to calculate
  the distance between buckets.
  
  @param unixTimeStamp the time-stamp to determine the bucket for
  
  @return the bucket for the specified {@code unixTimeStamp} based on the configuration of the time-series