A sign showing grouped opening hours of a cafe
JavaScript (ES6), 182 173 170 163 157 bytes

Saved 6 bytes with the help of edc65

Takes input as an array of strings and directly prints the result to the console:

h=&gt;{for(D="montuewedthufrisatsun".match(/.../g),d=c=i=j=0;j&lt;8;y=d)h[i]==h[6]?i++:(v=h[d=(i+j++)%7])!=c&amp;&amp;(j&gt;1&amp;&amp;console.log(D[x]+(x-y?'-'+D[y]:''),c),x=d,c=v)}


Formatted and commented

h =&gt; {                               // input = list h of opening hours
  for(                               //
    D = "montuewedthufrisatsun"      // D = list of abbreviated names of days
        .match(/.../g),              //
    d =                              // d = current day of week
    c =                              // c = current opening hours
    i =                              // i = first day of week to process
    j = 0;                           // j = day counter
    j &lt; 8;                           // stop when 7 days have been processed
    y = d                            // update y = last day of current day range
  )                                  //
  h[i] == h[6] ?                     // while the opening hours of day #i equal the opening
    i++                              // hours of sunday: increment i
  : (v = h[d = (i + j++) % 7]) != c  // else, if the new opening hours (v) of the current
    &amp;&amp; (                             // day (d) doesn't match the current opening hours (c):
      j &gt; 1 &amp;&amp;                       //   if this is not the first iteration:
        console.log(                 //     print:
          D[x] +                     //     - the first day of the current day range (x)
          (x - y ?                   //     - followed by either an empty string
            '-' + D[y]               //       or a '-' and the last day of the range
          : ''),                     //       (if they differ)
          c                          //     - the corresponding opening hours
        ),                           //   (endif)
      x = d,                         //   update x = first day of current day range
      c = v                          //   update c = current opening hours
    )                                // (endif)
}                                    // (end)


Test cases



let f =

h=&gt;{for(D="montuewedthufrisatsun".match(/.../g),d=c=i=j=0;j&lt;8;y=d)h[i]==h[6]?i++:(v=h[d=(i+j++)%7])!=c&amp;&amp;(j&gt;1&amp;&amp;console.log(D[x]+(x-y?'-'+D[y]:''),c),x=d,c=v)}

f(["0900-1800", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["0900-1800", "0900-1800", "0900-1800", "0930-1700", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["1100-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500"]);
console.log('-');
f(["1200-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500"]);