Moment: рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдШрдЯрд╛рдирд╛ рдЙрди рдШрдВрдЯреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдордзреНрдп рд░рд╛рддреНрд░рд┐ рдбреАрдПрд╕рдЯреА рдирд┐рдпрдо рд╣реЛрддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдЕрдЧре░ 2018  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: moment/moment

рдореБрджреНрджреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг:

рдореИрдВ рдПрдХ рддрд┐рдерд┐ рд╕реАрдорд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ (рдХреНрд╖рдг рддрд┐рдерд┐рдпреЛрдВ рдХреА рд╕рд░рдгреА) рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рддрд┐рдерд┐ рдкрд┐рдЫрд▓реА рдХреЗ рдмрд╛рдж 1 рджрд┐рди рд╣реИред рдпрд╣ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрдореЗрд░рд┐рдХрд╛ / рд╕реИрдВрдЯрд┐рдпрд╛рдЧреЛ рдЯрд╛рдЗрдордЬрд╝реЛрди рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реИ рдЬреЛ рдпреВрдЖрдИ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреА рдЧрдИ рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддрд┐рдерд┐ рдореЗрдВ 1 рджрд┐рди рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ 23 рдШрдВрдЯреЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИред

рдкрд░ рдПрдХ рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рде 8/11/2018 00:00:00 рдЕрдореЗрд░рд┐рдХрд╛ / рд╕реИрдВрдЯрд┐рдпрд╛рдЧреЛ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдХреЗ рд▓рд┐рдП 1 рджрд┐рди рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рд╕рдордп рдЬреЛрдбрд╝рдиреЗ 8/11/2018 23:00:00 рдХреЗ рдмрдЬрд╛рдп 8/12/2018 00:00:00 ред

рдбреЙрдХреНрд╕ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рджрд┐рдиреЛрдВ_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП DST рдХреЗ рдкрд╛рд░ рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдШрдВрдЯреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред

рджрд┐рди рдХреЗ рд╕рдордп рдХреА рдмрдЪрдд рдХреЗ рд╕рдордп рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдЪрд╛рд░ рднреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд░реНрд╖реЛрдВ, рдорд╣реАрдиреЛрдВ, рд╕рдкреНрддрд╛рд╣реЛрдВ рдпрд╛ рджрд┐рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореВрд▓ рдШрдВрдЯрд╛ рд╣рдореЗрд╢рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдШрдВрдЯреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред

// This code is from moment.js docs https://momentjs.com/docs/#/manipulating/add/
var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // the day before DST in the US
m.hours(); // 5
m.add(1, 'days').hours(); // 5

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдкрд░ рдЖрдзреА рд░рд╛рдд рдХреЛ рдбреАрдПрд╕рдЯреА рдирд┐рдпрдо рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рддрд┐рдерд┐ рд╣реИ рдЬреЛ рдЗрд╕ рдирд┐рдпрдо рд╕реЗ рдкрд╣рд▓реЗ рдордзреНрдпрд░рд╛рддреНрд░рд┐ рдХреЛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рддрд┐рдерд┐ рдореЗрдВ 1 рджрд┐рди рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдЧрд▓реЗ рджрд┐рди рдЖрдзреА рд░рд╛рдд / 0 рдШрдВрдЯреЗ (рдШрдВрдЯреЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ 23 рдШрдВрдЯреЗред

fmt = d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('08/11/2018 00:00:00'), 'America/Santiago');
fmt(x);                       // "2018-08-11T00:00:00-04:00 America/Santiago"
fmt(x.clone().add(1, 'day')); // "2018-08-11T23:00:00-04:00 America/Santiago" - offset unchanged, added 23 hours not 1 day
fmt(x.clone().add(2, 'day')); // "2018-08-13T00:00:00-03:00 America/Santiago" - original hour preserved now

рдпрд╣рд╛рдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 24 рдШрдВрдЯреЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЗрд╕реЗ 25 рдШрдВрдЯреЗ рддрдХ рд╢рд┐рдлреНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЯрд╛рдЗрдордЬрд╝реЛрди рдСрдлрд╕реЗрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред

fmt = d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('08/11/2018 00:00:00'), 'America/Santiago');
fmt(x);                          // "2018-08-11T00:00:00-04:00 America/Santiago"
fmt(x.clone().add(24, 'hours')); // "2018-08-12T01:00:00-03:00 America/Santiago" - offset changed, added 25 hours
fmt(x.clone().add(48, 'hours')); // "2018-08-13T01:00:00-03:00 America/Santiago"

рд╡рд╛рддрд╛рд╡рд░рдг:

  • рд╕рдВрд╕реНрдХрд░рдг 68.0.3440.84 (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмрд┐рд▓реНрдб) (64-рдмрд┐рдЯ)
  • Mac OSX El Capitan 10.11.6 (15G31)

рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ:

  • рдорд╢реАрди рдЯрд╛рдЗрдордЬрд╝реЛрди: рдпреВрдПрд╕ рдИрд╕реНрдЯрд░реНрди рдЯрд╛рдЗрдордЬрд╝реЛрди, рдбреЗрд▓рд╛рдЗрдЯ рд╕реЗрд╡рд┐рдВрдЧ рдЯрд╛рдЗрдо
  • рд╕рдордп рдФрд░ рджрд┐рдирд╛рдВрдХ рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: 22 рдЕрдЧрд╕реНрдд, 2018 рдХреЛ рджреЛрдкрд╣рд░ 3:00 рдмрдЬреЗ
  • рдореИрдВрдиреЗ рдХреНрд░реЛрдо рджреЗрд╡ рдЯреВрд▓реНрд╕ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдореЛрдореЗрдВрдЯ.рдЬреЗрдПрд╕ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛

рдЬреЗрдПрд╕ рджрд┐рдирд╛рдВрдХ рдЖрдЙрдЯрдкреБрдЯ

(рдирдИ рддрд┐рдерд┐ ())ред рд╕реНрдЯреНрд░рд┐рдВрдЧ ()

  • рдмреБрдз рдЕрдЧрд╕реНрдд 22 2018 15:13:40 GMT-0400 (рдкреВрд░реНрд╡реА рдбреЗрд▓рд╛рдЗрдЯ рд╕рдордп)

(рдирдИ рддрд┐рдерд┐ ())ред toLalealeString ()

  • 8/22/2018, 3:13:40 PM

(рдирдИ рддрд┐рдерд┐ ())ред getTimezoneOffset ()

  • 240

navigator.userAgent

  • рдореЛрдЬрд╝рд┐рд▓рд╛ / 5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit / 537.36 (KHTML, рдЬреИрд╕реЗ рдЧреЗрдХреЛ) Chrome / 68.0.3440.84 Safari / 537.36

moment.version

  • 2.22.2
Bug DST Pending Next Release Up-For-Grabs

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдБ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкрд▓-рдкрд▓ рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ v0.5.4 рдФрд░ v0.5.26ред
рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, '2018-08-11' рдореЗрдВ 1 рджрд┐рди рдЬреЛрдбрд╝рдХрд░ рдЖрдкрдХреЛ рдЙрд╕реА рджрд┐рди 11pm рджрд┐рдпрд╛ рдЧрдпрд╛
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдЖрдзреА рд░рд╛рдд рдХреЛ '2018-08-12' рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ 1 рдорд┐рдирдЯ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдПрдХ рдШрдВрдЯреЗ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕ рдбреАрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ 1 рдШрдВрдЯреЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛ред

рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
https://jsfiddle.net/eqyvuxht/1/

рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг, рдмрджрд▓рд╛ рд╣реБрдЖ рд╡реНрдпрд╡рд╣рд╛рд░, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧрд▓рдд рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?
https://jsfiddle.net/0h6atn4b/4/

рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:

function switchZone(m, zone) {
  let arr = [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second()];
  if(zone) {
    return moment.tz(arr, zone);
  }
  return moment(arr);
}

function safeAddDays(m, days) {
   let oldZone = m.tz();
   let utc = switchZone(m, 'UTC');
   utc.add(days, 'days');
   return switchZone(utc, oldZone);
}

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдЗрд╕реЗ рдпреВрд░реЛрдк / рд░реЛрдо рдХреЗ рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЗрд╕рдореЗрдВ рдЕрд╕рдорд░реНрде рд░рд╣рд╛:

рдпреВрд░реЛрдк / рд░реЛрдо - https://www.timeanddate.com/time/change/italy/rome

рдЕрдХреНрдЯреВрдмрд░ 28, 2018 - рдбреЗрд▓рд╛рдЗрдЯ рд╕реЗрд╡рд┐рдВрдЧ рдЯрд╛рдЗрдо рдПрдВрдбреНрд╕
рдЬрдм рд╕реНрдерд╛рдиреАрдп рджрд┐рди рдХреЗ рдЙрдЬрд╛рд▓реЗ рдХрд╛ рд╕рдордп рдкрд╣реБрдБрдЪрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ
рд░рд╡рд┐рд╡рд╛рд░, 28 рдЕрдХреНрдЯреВрдмрд░, 2018, 3:00 рдмрдЬреЗ рдШрдбрд╝рд┐рдпреЛрдВ рдХреЛ 1 рдШрдВрдЯреЗ рдкреАрдЫреЗ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд░рд╡рд┐рд╡рд╛рд░, рдЕрдХреНрдЯреВрдмрд░ 28, 2018, 2:00:00 рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд╛рдиреАрдп рдорд╛рдирдХ рд╕рдордп рд╣реИред

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИред

d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('10/27/2018 00:00:00'), 'Europe/Rome');
fmt(x)                       // "2018-10-27T06:00:00+02:00 Europe/Rome"
fmt(x.clone().add(1, 'day')) // "2018-10-28T06:00:00+01:00 Europe/Rome" - tz offset changed, hour preserved as expected
fmt(x.clone().add(2, 'day')) // "2018-10-29T06:00:00+01:00 Europe/Rome"

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ TZ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдШрдВрдЯреЗ рд╕реНрдерд┐рд░ рд░рд╣рддреЗ рд╣реИрдВред

рдкреНрд░рдЬрдирди рдЪрд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реИ рдЬрдм рддрд╛рд░реАрдЦ рдиреЗ рдбреАрдПрд╕рдЯреА рдХрдЯрдСрдл рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрдорд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╕реИрдВрдЯрд┐рдпрд╛рдЧреЛ рдХреЗ рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдбреАрдПрд╕рдЯреА рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдЖрдзреА рд░рд╛рдд рдХреЛ рдШрдбрд╝рд┐рдпрд╛рдВ рдПрдХ рдШрдВрдЯреЗ рдкреАрдЫреЗ рдЪрд▓реА рдЬрд╛рддреА рд╣реИрдВред

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрдврд╝рдд рдорд╛рдорд▓рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдордзреНрдпрд░рд╛рддреНрд░рд┐ рдореЗрдВ рдбреАрдПрд╕рдЯреА рдХрдЯрдСрдл рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗ рд╕рд╛рде рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдерд╛ рдЬрд╣рд╛рдВ рдХрдЯрдСрдл 3 рдмрдЬреЗ рд╣реИ, x 3 рдкрд░

рдпреВрд░реЛрдк / рд░реЛрдо - https://www.timeanddate.com/time/change/italy/rome

рдЕрдХреНрдЯреВрдмрд░ 28, 2018 - рдбреЗрд▓рд╛рдЗрдЯ рд╕реЗрд╡рд┐рдВрдЧ рдЯрд╛рдЗрдо рдПрдВрдбреНрд╕
рдЬрдм рд╕реНрдерд╛рдиреАрдп рджрд┐рди рдХреЗ рдЙрдЬрд╛рд▓реЗ рдХрд╛ рд╕рдордп рдкрд╣реБрдБрдЪрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ
рд░рд╡рд┐рд╡рд╛рд░, 28 рдЕрдХреНрдЯреВрдмрд░, 2018, 3:00 рдмрдЬреЗ рдШрдбрд╝рд┐рдпреЛрдВ рдХреЛ 1 рдШрдВрдЯреЗ рдкреАрдЫреЗ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд░рд╡рд┐рд╡рд╛рд░, рдЕрдХреНрдЯреВрдмрд░ 28, 2018, 2:00:00 рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд╛рдиреАрдп рдорд╛рдирдХ рд╕рдордп рд╣реИред

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИред

fmt = d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('October 27, 2018 03:00:00'), 'Europe/Rome');
fmt(x);                       // "2018-10-27T09:00:00+02:00 Europe/Rome"
fmt(x.clone().add(1, 'days')) // "2018-10-28T09:00:00+01:00 Europe/Rome" - tz offset changed, hour preserved as expected
fmt(x.clone().add(2, 'days')) // "2018-10-29T09:00:00+01:00 Europe/Rome"

рдореИрдВ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рдпрд╣ рдмрдЧ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ рдЬрдм рдбреАрдПрд╕рдЯреА рдХрдЯрдСрдл рдЖрдзреА рд░рд╛рдд рдХреЛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдк рдПрдХ рддрд╛рд░реАрдЦ рдореЗрдВ рд╕рдордп рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рддрд╛рд░реАрдЦ рдХреЛ рдХрдЯрдСрдл рдкрд░ рдЙрддрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдЕрдореЗрд░рд┐рдХрд╛ / рдкреБрдВрдЯрд╛_рдЕрд░реЗрдирд╕ - https://www.timeanddate.com/time/zone/chile/punta-arenas
2016 рдореЗрдВ, рдЗрд╕ рдЯрд╛рдЗрдордЬрд╝реЛрди рдореЗрдВ рдЖрдзреА рд░рд╛рдд рдХреЛ рднреА рдХрдЯрдСрдл рдереАред

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рдмрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ

fmt = d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('08/13/2016 00:00:00'), 'America/Punta_Arenas')
fmt(x);                        // "2016-08-13T00:00:00-04:00 America/Punta_Arenas"
fmt(x.clone().add(1, 'days')); // "2016-08-13T23:00:00-04:00 America/Punta_Arenas" - 23 hours added, not 1 day, no tz offset change
fmt(x.clone().add(2, 'days')); // "2016-08-15T00:00:00-03:00 America/Punta_Arenas"

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЯрд╛рдЗрдордЬрд╝реЛрди (рдЖрдзреА рд░рд╛рдд рдХреЛ рдбреАрдПрд╕рдЯреА) рдкрд░ рдШрдЯрд╛рдХрд░ рдПрдХ рд╕рдорд╛рди рдореБрджреНрджрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдЬрдм DST рд╢рд┐рдлреНрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рджрд┐рди рдШрдВрдЯреЗ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╛рд░реАрдЦ рдмрджрд▓ рджреА рдЬрд╛рддреА рд╣реИред

fmt = d => d.format() + ' ' + d.tz()

x = moment.tz(new Date('08/13/2018 23:00:00'), 'America/Santiago');
fmt(x);                             // "2018-08-14T00:00:00-03:00 America/Santiago"
fmt(x.clone().subtract(1, 'days')); // "2018-08-13T00:00:00-03:00 America/Santiago"
fmt(x.clone().subtract(2, 'days')); // "2018-08-12T01:00:00-03:00 America/Santiago" - hour not preserved, but date changed
fmt(x.clone().subtract(3, 'days')); // "2018-08-11T00:00:00-04:00 America/Santiago" - original hour preserved now

рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдПрдХ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдорд┐рд▓реА, рдЬрд┐рд╕рдореЗрдВ America/Asuncion рдХреЛ рдЙрдирдХреЗ рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдмрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

function generateDayRange(start, end) {
    const days = [];
    let current = start.clone();

    while (current <= end) {
        days.push(current.clone());
        current = current.add(1, 'days');
    }

    return days;
}

рдЬрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╢реБрд░реБрдЖрдд рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдПрдХ рдЕрдВрддрд┐рдо рддрд┐рдерд┐ рдЬрд╣рд╛рдВ рд╕рдордп рдЙрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ:

generateDayRange(startDate.clone().startOf('week'), startDate.clone().endOf('week'));
generateDayRange(getAppDate(startDate), getAppDate(endDate));
generateDayRange(startRange, startRange.clone().add(27, 'days'));

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд╖рдг рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рджрд┐рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдпреВрдЖрдИ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ (рдПрдХ рдХреИрд▓реЗрдВрдбрд░ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рджрд┐рди рд╣реЛрддрд╛ рд╣реИ)ред

рдореЗрд░реА рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рдореБрджреНрджреЛрдВ рдкрд░ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдХрдерд┐рдд рдиреБрдХрд╕рд╛рди, рдЦрд░рд╛рдм рдЕрдиреБрд░реЛрдз, рдЖрджрд┐ред

рдореИрдВ рдХреЛрдбрдкреИрди рдпрд╛ рдХреБрдЫ рдФрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдЙрддреНрд╕реБрдХ рдкрд╛рдардХ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдм рд▓реЗ рд╕рдХреЗрдВред

рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ # 4785 рдХреЛрдб рдХреЗ рд▓рд┐рдВрдХ рд╣реИрдВ:
рдкрд▓ рдЙрджрд╛рд╣рд░рдг https://runkit.com/embed/1r62d83amq7x
рдЕрднреА рддрдХ рд▓рдХреНрд╕рди рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ
https://runkit.com/embed/t49achvensqf

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ DST рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ develop (рд▓реЗрдХрд┐рди рдЬрд╛рд░реА рдирд╣реАрдВ) рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдб рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╛, рд╣рдо рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рд╕рдорд╛рди рд╣реИрдВред

рдпрд╣рд╛рдБ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкрд▓-рдкрд▓ рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ v0.5.4 рдФрд░ v0.5.26ред
рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, '2018-08-11' рдореЗрдВ 1 рджрд┐рди рдЬреЛрдбрд╝рдХрд░ рдЖрдкрдХреЛ рдЙрд╕реА рджрд┐рди 11pm рджрд┐рдпрд╛ рдЧрдпрд╛
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдЖрдзреА рд░рд╛рдд рдХреЛ '2018-08-12' рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ 1 рдорд┐рдирдЯ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдПрдХ рдШрдВрдЯреЗ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕ рдбреАрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ 1 рдШрдВрдЯреЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛ред

рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
https://jsfiddle.net/eqyvuxht/1/

рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг, рдмрджрд▓рд╛ рд╣реБрдЖ рд╡реНрдпрд╡рд╣рд╛рд░, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧрд▓рдд рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?
https://jsfiddle.net/0h6atn4b/4/

рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:

function switchZone(m, zone) {
  let arr = [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second()];
  if(zone) {
    return moment.tz(arr, zone);
  }
  return moment(arr);
}

function safeAddDays(m, days) {
   let oldZone = m.tz();
   let utc = switchZone(m, 'UTC');
   utc.add(days, 'days');
   return switchZone(utc, oldZone);
}

рд╣рдо рдЗрд╕реА рдорд╣реАрдиреЗ (рд╕рд┐рддрдВрдмрд░ 2019) рдХреЛ рдЬрд╛рд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯреЛ рдкрд┐рдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣рдорд╛рд░реЗ рд╕реИрдВрдЯрд┐рдпрд╛рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреИрд▓реЗрдВрдбрд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред рд╕рд┐рддрдВрдмрд░ рдХрд╛ рдорд╣реАрдирд╛ ... рд╣реБрдб рдХреЗ рддрд╣рдд, рд╣рдо .add(1, 'days') рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЕрдЧрд▓реЗ рд╕рд╛рд▓ рд╕рд┐рддрдВрдмрд░ 2020 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИред

@mblandfo рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЯреНрд░рд┐рдХ рднреА рд▓рдЧрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ninigix picture ninigix  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dbshwang picture dbshwang  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

IbraheemAlSaady picture IbraheemAlSaady  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alvarotrigo picture alvarotrigo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ