+ /**
+ * Determine the next birthday, but only if the birthday is published
+ * in the default profile. We _could_ also look for a private profile that the
+ * recipient can see, but somebody could get mad at us if they start getting
+ * public birthday greetings when they haven't made this info public.
+ *
+ * Assuming we are able to publish this info, we are then going to convert
+ * the start time from the owner's timezone to UTC.
+ *
+ * This will potentially solve the problem found with some social networks
+ * where birthdays are converted to the viewer's timezone and salutations from
+ * elsewhere in the world show up on the wrong day. We will convert it to the
+ * viewer's timezone also, but first we are going to convert it from the birthday
+ * person's timezone to GMT - so the viewer may find the birthday starting at
+ * 6:00PM the day before, but that will correspond to midnight to the birthday person.
+ *
+ * @param int $uid User id
+ * @param string $tz Time zone string, like UTC
+ * @return string Formatted birthday string
+ */
+ private static function determineNextBirthday(int $uid, string $tz): string
+ {
+ $birthday = '';
+
+ if (!strlen($tz)) {
+ $tz = 'UTC';
+ }
+
+ $profile = DBA::selectFirst('profile', ['dob'], ['uid' => $uid]);
+ if (DBA::isResult($profile)) {
+ $tmp_dob = substr($profile['dob'], 5);
+ if (intval($tmp_dob)) {
+ $y = DateTimeFormat::timezoneNow($tz, 'Y');
+ $bd = $y . '-' . $tmp_dob . ' 00:00';
+ $t_dob = strtotime($bd);
+ $now = strtotime(DateTimeFormat::timezoneNow($tz));
+ if ($t_dob < $now) {
+ $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
+ }
+ $birthday = DateTimeFormat::convert($bd, 'UTC', $tz, DateTimeFormat::ATOM);
+ }
+ }
+
+ return $birthday;
+ }
+