include_once('wp-content/search-includes/config.php');
include_once('wp-content/search-includes/admin_functions.php');
include_once('wp-content/search-includes/Validate.php');
// ---------------------------------------------------------------------------
// IANA timezone map — same as meeting-search-virtual-dev.php
// ---------------------------------------------------------------------------
function getMeetingIanaMap(): array {
return [
'ACDT' => 'Australia/Adelaide', 'ACST' => 'Australia/Darwin',
'ACWT' => 'Australia/Eucla', 'ADT' => 'America/Halifax',
'ACT' => 'America/Rio_Branco', 'AEDT' => 'Australia/Sydney',
'AEST' => 'Australia/Brisbane', 'AFT' => 'Asia/Kabul',
'AKDT' => 'America/Anchorage', 'AKST' => 'America/Anchorage',
'ALMT' => 'Asia/Almaty', 'AMT' => 'Asia/Yerevan',
'AMST' => 'America/Manaus', 'ANAT' => 'Asia/Anadyr',
'ANAST' => 'Asia/Anadyr', 'AQTT' => 'Asia/Aqtobe',
'ART' => 'America/Argentina/Buenos_Aires',
'AST' => 'America/Halifax', 'AWDT' => 'Australia/Perth',
'AWST' => 'Australia/Perth', 'AZOT' => 'Atlantic/Azores',
'AZOST' => 'Atlantic/Azores', 'AZT' => 'Asia/Baku',
'AZST' => 'Asia/Baku', 'BNT' => 'Asia/Brunei',
'BDT' => 'Asia/Dhaka', 'BOT' => 'America/La_Paz',
'BRT' => 'America/Sao_Paulo', 'BST' => 'Europe/London',
'BTT' => 'Asia/Thimphu', 'BT' => 'Europe/London',
'BGT' => 'Europe/Berlin', 'CAST' => 'Antarctica/Casey',
'CAT' => 'Africa/Harare', 'CCT' => 'Indian/Cocos',
'CEDT' => 'Europe/Paris', 'CEST' => 'Europe/Paris',
'CET' => 'Europe/Belgrade', 'CHADT' => 'Pacific/Chatham',
'CHAST' => 'Pacific/Chatham', 'CHOT' => 'Asia/Choibalsan',
'CHOST' => 'Asia/Choibalsan', 'CHsT' => 'Pacific/Guam',
'CHUT' => 'Pacific/Truk', 'CIT' => 'Asia/Makassar',
'CKT' => 'Pacific/Rarotonga', 'CLST' => 'America/Santiago',
'CLT' => 'America/Santiago', 'COT' => 'America/Bogota',
'CST' => 'America/Chicago', 'CT' => 'America/Chicago',
'CVT' => 'Atlantic/Cape_Verde', 'CWST' => 'Australia/Eucla',
'CXT' => 'Indian/Christmas', 'DAVT' => 'Antarctica/Davis',
'DDUT' => 'Antarctica/DumontDUrville',
'EASST' => 'Pacific/Easter', 'EAST' => 'Pacific/Easter',
'EAT' => 'Africa/Nairobi', 'ECT' => 'America/Guayaquil',
'EDT' => 'America/New_York', 'EEDT' => 'Europe/Helsinki',
'EEST' => 'Europe/Helsinki', 'EET' => 'Europe/Helsinki',
'EGT' => 'America/Scoresbysund', 'EGST' => 'America/Scoresbysund',
'EST' => 'America/New_York', 'ET' => 'America/New_York',
'EIT' => 'Asia/Jayapura', 'FET' => 'Europe/Minsk',
'FJT' => 'Pacific/Fiji', 'FJST' => 'Pacific/Fiji',
'FKST' => 'Atlantic/Stanley', 'FKT' => 'Atlantic/Stanley',
'FNT' => 'America/Noronha', 'GALT' => 'Pacific/Galapagos',
'GAMT' => 'Pacific/Gambier', 'GET' => 'Asia/Tbilisi',
'GFT' => 'America/Cayenne', 'GILT' => 'Pacific/Tarawa',
'GMT' => 'Etc/GMT', 'GST' => 'Asia/Dubai',
'GYT' => 'America/Guyana', 'HADT' => 'America/Adak',
'HAST' => 'America/Adak', 'HKT' => 'Asia/Hong_Kong',
'HOVT' => 'Asia/Hovd', 'HOVST' => 'Asia/Hovd',
'HST' => 'Pacific/Honolulu', 'ICT' => 'Asia/Bangkok',
'IDT' => 'Asia/Jerusalem', 'IOT' => 'Indian/Chagos',
'IRDT' => 'Asia/Tehran', 'IRKT' => 'Asia/Irkutsk',
'IRKST' => 'Asia/Irkutsk', 'IRST' => 'Asia/Tehran',
'IST' => 'Asia/Kolkata', 'IST2' => 'Europe/Dublin',
'JST' => 'Asia/Tokyo', 'KGT' => 'Asia/Bishkek',
'KOST' => 'Pacific/Kosrae', 'KRAT' => 'Asia/Krasnoyarsk',
'KRAST' => 'Asia/Krasnoyarsk', 'KST' => 'Asia/Seoul',
'KUYT' => 'Europe/Samara', 'LHDT' => 'Australia/Lord_Howe',
'LHST' => 'Australia/Lord_Howe', 'LINT' => 'Pacific/Kiritimati',
'LT' => 'Europe/London', 'MAGT' => 'Asia/Magadan',
'MAGST' => 'Asia/Magadan', 'MART' => 'Pacific/Marquesas',
'MAWT' => 'Antarctica/Mawson', 'MDT' => 'America/Denver',
'MeST' => 'America/Metlakatla', 'MHT' => 'Pacific/Majuro',
'MIST' => 'Antarctica/Macquarie', 'MMT' => 'Asia/Rangoon',
'MSD' => 'Europe/Moscow', 'MSK' => 'Europe/Moscow',
'MST' => 'America/Phoenix', 'MT' => 'America/Denver',
'MUT' => 'Indian/Mauritius', 'MVT' => 'Indian/Maldives',
'MYT' => 'Asia/Kuala_Lumpur', 'NCT' => 'Pacific/Noumea',
'NDT' => 'America/St_Johns', 'NFT' => 'Pacific/Norfolk',
'NOVT' => 'Asia/Novosibirsk', 'NOVST' => 'Asia/Novosibirsk',
'NPT' => 'Asia/Kathmandu', 'NRT' => 'Pacific/Nauru',
'NST' => 'America/St_Johns', 'NT' => 'America/St_Johns',
'NUT' => 'Pacific/Niue', 'NZT' => 'Pacific/Auckland',
'NZST' => 'Pacific/Auckland', 'OMST' => 'Asia/Omsk',
'OMSST' => 'Asia/Omsk', 'ORAT' => 'Asia/Oral',
'PDT' => 'America/Los_Angeles', 'PET' => 'America/Lima',
'PETT' => 'Asia/Kamchatka', 'PETST' => 'Asia/Kamchatka',
'PGT' => 'Pacific/Port_Moresby', 'PHT' => 'Asia/Manila',
'PHOT' => 'Pacific/Enderbury', 'PKT' => 'Asia/Karachi',
'PMDT' => 'America/Miquelon', 'PMST' => 'America/Miquelon',
'PONT' => 'Pacific/Pohnpei', 'PORT' => 'Europe/Lisbon',
'PST' => 'America/Los_Angeles', 'PT' => 'America/Los_Angeles',
'PWT' => 'Pacific/Palau', 'PYT' => 'America/Asuncion',
'PYST' => 'America/Asuncion', 'QYZT' => 'Asia/Qyzylorda',
'RET' => 'Indian/Reunion', 'ROTT' => 'Antarctica/Rothera',
'SAKT' => 'Asia/Sakhalin', 'SAMT' => 'Europe/Samara',
'SAST' => 'Africa/Johannesburg', 'SBT' => 'Pacific/Guadalcanal',
'SCT' => 'Indian/Mahe', 'SGT' => 'Asia/Singapore',
'SLT' => 'Asia/Colombo', 'SLST' => 'Asia/Colombo',
'SRT' => 'America/Paramaribo', 'SRET' => 'Asia/Srednekolymsk',
'SST' => 'Pacific/Pago_Pago', 'SYOT' => 'Antarctica/Syowa',
'TAHT' => 'Pacific/Tahiti', 'TFT' => 'Indian/Kerguelen',
'TJT' => 'Asia/Dushanbe', 'TKT' => 'Pacific/Fakaofo',
'TLT' => 'Asia/Dili', 'TMT' => 'Asia/Ashgabat',
'TOT' => 'Pacific/Tongatapu', 'TRT' => 'Europe/Istanbul',
'TRUT' => 'Pacific/Truk', 'TVT' => 'Pacific/Funafuti',
'ULAT' => 'Asia/Ulaanbaatar', 'ULAST' => 'Asia/Ulaanbaatar',
'UTC' => 'UTC', 'UYST' => 'America/Montevideo',
'UYT' => 'America/Montevideo', 'UZT' => 'Asia/Tashkent',
'VET' => 'America/Caracas', 'VLAT' => 'Asia/Vladivostok',
'VLAST' => 'Asia/Vladivostok', 'VOLT' => 'Europe/Volgograd',
'VUT' => 'Pacific/Efate', 'WAKT' => 'Pacific/Wake',
'WAT' => 'Africa/Lagos', 'WAST' => 'Africa/Windhoek',
'WDT' => 'Australia/Perth', 'WEDT' => 'Europe/Lisbon',
'WEST' => 'Europe/Lisbon', 'WET' => 'Europe/Lisbon',
'WFT' => 'Pacific/Wallis', 'WGT' => 'America/Godthab',
'WGST' => 'America/Godthab', 'WIB' => 'Asia/Jakarta',
'WIT' => 'Asia/Jayapura', 'WITA' => 'Asia/Makassar',
'WST' => 'Australia/Perth', 'WT' => 'Africa/Monrovia',
'YAKT' => 'Asia/Yakutsk', 'YAKST' => 'Asia/Yakutsk',
'YAP' => 'Pacific/Truk', 'YEKT' => 'Asia/Yekaterinburg',
'YEKST' => 'Asia/Yekaterinburg',
];
}
// ---------------------------------------------------------------------------
// Convert a meeting time (meeting-local tz) to the user's timezone.
// Returns [userDayName, userTime H:i:s, userDayNum, localDayName, dayShifted Y/N]
// ---------------------------------------------------------------------------
function convertToUserTime(
string $meetingDay,
string $meetingTime,
string $meetingTzCode,
DateTimeZone $userTz
): array {
static $ianaMap = null;
if ($ianaMap === null) {
$ianaMap = getMeetingIanaMap();
}
$dayNames = [
1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday',
5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday',
];
$ianaName = $ianaMap[$meetingTzCode] ?? 'UTC';
$meetingTz = new DateTimeZone($ianaName);
$dt = new DateTime($meetingDay . ' ' . $meetingTime, $meetingTz);
$origDayNum = (int) $dt->format('N');
$dt->setTimezone($userTz);
$userDayNum = (int) $dt->format('N');
return [
0 => $dayNames[$userDayNum],
1 => $dt->format('H:i:s'),
2 => $userDayNum,
3 => $dayNames[$origDayNum],
4 => ($userDayNum !== $origDayNum) ? 'Y' : 'N',
];
}
// ---------------------------------------------------------------------------
// Given a user-local weekday name and time (H:i:s), return the next DateTime
// on or after $now when that meeting occurs. If the slot already passed this
// week, returns the occurrence next week.
// ---------------------------------------------------------------------------
function nextOccurrence(string $dayName, string $timeStr, DateTime $now): DateTime {
$dayNums = ['Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,
'Friday'=>5,'Saturday'=>6,'Sunday'=>7];
$targetNum = $dayNums[$dayName] ?? 1;
$todayNum = (int) $now->format('N');
$diff = ($targetNum - $todayNum + 7) % 7;
[$h, $i, $s] = array_pad(explode(':', $timeStr), 3, '00');
$dt = clone $now;
if ($diff > 0) {
$dt->modify("+{$diff} days");
}
$dt->setTime((int)$h, (int)$i, (int)$s);
// If this slot has already passed today, jump to next week
if ($dt < $now) {
$dt->modify('+7 days');
}
return $dt;
}
// ---------------------------------------------------------------------------
// First-visit: browser hasn't told us the IANA timezone yet.
// Output a lightweight redirect page before any WordPress theme HTML fires.
// ---------------------------------------------------------------------------
$userTzName = clean_request($_GET, 'mytimezone', 'basic', 100);
if ($userTzName === '') {
$baseUrl = 'https://' . $_SERVER['HTTP_HOST']
. strtok($_SERVER['REQUEST_URI'], '?')
. '?mytimezone=';
?>
Detecting timezone…
Detecting your timezone — if this page does not redirect within 5 seconds,
click here .
modify('+24 hours');
// Normal page load from here on.
get_header();
?>
where('status', 'Active');
$rawData = $db->get('groups_live g', null, $cols);
// ---------------------------------------------------------------------------
// For each meeting row, determine venue fields, convert times, find next
// occurrence, and keep those that fall within the 24-hour window.
// Multi-day meetings generate one entry per qualifying day.
// ---------------------------------------------------------------------------
$results = [];
foreach ($rawData as $row) {
$startTime = null;
$endTime = null;
$tzCode = null;
$daysStr = '';
$venueLabel = '';
$originates = '';
switch ($row['primary_venue']) {
case 'Video':
$startTime = $row['vid_start_time'] ?? null;
$endTime = $row['vid_end_time'] ?? null;
$tzCode = $row['vid_time_zone'] ?? null;
$daysStr = $row['vid_meeting_day'] ?? '';
$venueLabel = 'Video';
$originates = trim(($row['vid_host_location'] ?? '') . ' ' . ($row['vid_host_country'] ?? ''));
break;
case 'Phone':
$startTime = $row['phone_start_time'] ?? null;
$endTime = $row['phone_end_time'] ?? null;
$tzCode = $row['phone_time_zone'] ?? null;
$daysStr = $row['phone_meeting_day'] ?? '';
$venueLabel = 'Phone';
$originates = trim(($row['phone_host_location'] ?? '') . ' ' . ($row['phone_host_country'] ?? ''));
break;
case 'Email':
if (($row['email_specifictime'] ?? '') === 'no') continue 2;
$startTime = $row['email_start_time'] ?? null;
$endTime = $row['email_end_time'] ?? null;
$tzCode = $row['email_time_zone'] ?? null;
$daysStr = $row['email_meeting_day'] ?? '';
$venueLabel = 'Email/Chat';
break;
case 'F2F':
$startTime = $row['f2f_start_time'] ?? null;
$endTime = $row['f2f_end_time'] ?? null;
$tzCode = $row['master_time_zone'] ?? null; // F2F uses master tz
$daysStr = $row['f2f_meeting_day'] ?? '';
$venueLabel = 'Face-to-face';
$originates = trim(($row['f2f_city'] ?? '') . ' ' . ($row['f2f_state'] ?? ''));
break;
default:
continue 2;
}
if (!$startTime || !$endTime || !$tzCode || $daysStr === '') continue;
$days = array_filter(array_map('trim', explode(',', $daysStr)));
if (empty($days)) continue;
foreach ($days as $meetingDay) {
$convStart = convertToUserTime($meetingDay, $startTime, $tzCode, $userTz);
$convEnd = convertToUserTime($meetingDay, $endTime, $tzCode, $userTz);
$userDayName = $convStart[0];
$userTimeStr = $convStart[1];
$localDay = $convStart[3]; // meeting-local day name
$dayShifted = $convStart[4];
$nextOcc = nextOccurrence($userDayName, $userTimeStr, $nowUser);
// Skip if outside the 24-hour window
if ($nextOcc > $cutoffUser) continue;
$results[] = [
'next_occ' => $nextOcc,
'user_day' => $userDayName,
'user_start' => $userTimeStr,
'user_end' => $convEnd[1],
'local_day' => $localDay,
'local_start' => $startTime,
'local_end' => $endTime,
'tz_code' => $tzCode,
'day_shifted' => $dayShifted,
'venue_label' => $venueLabel,
'originates' => $originates,
'row' => $row,
];
}
}
// Sort by next occurrence ascending (soonest first)
usort($results, fn($a, $b) => $a['next_occ'] <=> $b['next_occ']);
// Pre-load timezone descriptions for all tz codes we actually use
$allTzCodes = array_unique(array_filter(array_column($results, 'tz_code')));
$tzDescMap = [];
if (!empty($allTzCodes)) {
$db->where('tz_code', $allTzCodes, 'IN');
foreach ($db->get('timezones_wshift') as $tzRow) {
$tzDescMap[$tzRow['tz_code']] = $tzRow['tz_description'];
}
}
?>
Meetings Starting in the Next 24 Hours
Your timezone:
Window:
format('l, F j g:i a'); ?>
→
format('l, F j g:i a'); ?>
↻ Refresh
meeting(s) found.
Slide results side-to-side to see all columns.
Starts
Meeting (Group #)
Venue
Local time & Originates
getTimestamp() - $nowUser->getTimestamp()) / 60);
if ($minutesAway < 60) {
$startsIn = $minutesAway . ' min';
} else {
$h = (int)($minutesAway / 60);
$m = $minutesAway % 60;
$startsIn = $h . 'h' . ($m > 0 ? ' ' . $m . 'm' : '');
}
$typesArray = explode(',', $row['meeting_venue']);
$isHybrid = ($row['venue_hybrid_dual'] === 'Hybrid');
$isDual = ($row['venue_hybrid_dual'] === 'Dual');
$parms = '?mid=' . $row['master_id']
. '&mytz=Y'
. '&mytimezone=' . urlencode($userTzName)
. '&usemytime=1'
. '&sid=' . session_id()
. '&searchType=Virtual'
. '&mv=' . urlencode($row['primary_venue']);
// Resolve originates country name
$originates = $result['originates'];
if ($row['primary_venue'] === 'Video' && $row['vid_host_country'] !== '') {
$db->where('iso3', $row['vid_host_country']);
foreach ($db->get('country') as $cr) { $originates = trim(($row['vid_host_location'] ?? '') . ', ' . $cr['name']); }
} elseif ($row['primary_venue'] === 'Phone' && $row['phone_host_country'] !== '') {
$db->where('iso3', $row['phone_host_country']);
foreach ($db->get('country') as $cr) { $originates = trim(($row['phone_host_location'] ?? '') . ', ' . $cr['name']); }
} elseif ($row['primary_venue'] === 'F2F' && $row['f2f_country'] !== '') {
$db->where('iso3', $row['f2f_country']);
foreach ($db->get('country') as $cr) {
$parts = array_filter([$row['f2f_city'], $row['f2f_state'], $cr['name']]);
$originates = implode(', ', $parts);
}
}
?>
format('g:i a'); ?>
in
( locally)
(
#)
Dual venue '; endif; ?>
Hybrid meeting '; endif; ?>
–
Skip to content
Events for April 17, 2026 - April 17, 2026
2026-04-17T00:00:00-04:00
March 2026
Sun
22
The WSC BDA Committee hosts a 12 STEP BDA WORKSHOP GROW A THRIVING BUSINESS ALONG SPIRITUAL LINES USING THE BDA STEP STUDY GUIDE Part 2 - March 22 2p-5p EST online View & Hear the 12 Step Study Guide for BDA onscreen and/or bring your own Reflect and Write Recover together by sharing your step
Sat
28
Saturday, March 28 3:00PM (EDT) - 19:00 (GMT) UK - 20:00 (CET) Central Europe https://us06web.zoom.us/j/85025001420?pwd=zbGfXLTHaZYkBbKEsEBma8T2ZmbDJh.1 Organized by the WSC GLOBAL COMMITTEE. Join us for a special one-hour Debtors Anonymous workshop featuring 3 speakers from different parts of the world. This meeting highlights recovery in places where D.A. is still emerging or not widely active. A
April 2026
Wed
15
Several live webinars from around the world: Join us to celebrate FIFTY YEARS of Debtors Anonymous! This year, the Fellowship Communications Committee is hosting FIVE webinars featuring “DA Founders” from around the world. Following the speakers’ shares, there will be time for Q&A and other stories. https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf Please join one (or all!) of
Wed
15
Asia Pacific https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf
Wed
15
Europe, Middle East, Africa Region https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf
Wed
15
Eastern USA https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf
Wed
15
Central USA https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf
Wed
15
Western USA https://www.debtorsanonymous.org/wp-content/uploads/Founders-Day-3.pdf
May 2026
Sat
23
Check back for more details!
Sat
30
A 25 hour online Convention to celebrate our 50th Anniversary! Click here for Convention Details
The Calendar of Events shows information about events related to world service in Debtors Anonymous, such as Fellowship-wide Calls and the annual World Service Conference. For event flyers, please visit:
https://debtorsanonymous.org/announcements
Information on regional events is available through the links to Regional Intergroup websites which can be found here: Find a Regional DA Intergroup
The General Service Board (GSB) and the General Service Office (GSO) of Debtors Anonymous provide this link to facilitate information about local D.A. activities. Our link to this or any other site, other than the D.A. website, debtorsanonymous.org, does not constitute or indicate any review, endorsement, or approval by the D.A. GSB, D.A. GSO, nor any entity within the D.A. community.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec auctor eros, sed suscipit eros. Nulla porttitor nisi ac hendrerit finibus. Duis dapibus lacus sit amet porttitor porta. Nulla facilisi.
Sign-up to get the latest news and update information. Don't worry, we won't send spam!
[contact-form-7 id="3145" title="Sliding Bar Form"]
Page load link