Docstring doesn't quite explain the algorithm.

In pseudocode:

given that I have a time object containing at least hours and minutes with timezone information:
  convert that time object to UTC
  multiple the hours portion by 2, yielding an even number between 0 and 46
  if the minute portion is 30 to 60, add 1 to the number
  return that number

There are also some interesting gotchas; because the Recipient model only specifies hours, the bucket calculation is for that hour on today's date.