Question

Help figuring formula to get Hour and Minute of clock by angle

Asked by: stormist

I'm working on a software program with a clock control. I have the angle calculated where 1-30 degrees is 2 o clock, 31-60 degrees is 1 and so on in counter clockwise direction. So to list them all

Time/Degrees

12/ 61-90
1/31-60
2/1-30
3/331-360
4/301-330
5/271-300
6/241-270
7/211-240
8/181-210
9/151-180
10/121-150
11/61-90

What would be a formula if given the angle you could find the hour?

What would be the formula to find out which minute the minute hand is pointing to if given the angle of it?

And if possible, how would you find the correct angle of the minute hand if given the angle of the hour hand on this degree setup?

Thanks a ton to any math whizzes, this is not homework I promise. Its a real issue I'm dealing with on a .NET control.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-09-12 at 17:59:12ID24727413
Topics

Algorithms

,

Probability & Statistics

,

Math & Science

Participating Experts
3
Points
500
Comments
19

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. A Triangle Math Formula
    This has little to do with VB other than the program I am writing is written in VB. It is really about math but I didn't know where else to ask. I have a triangle a |\ |_\c b I always know the length of the three sides. Angle b is always 90 degrees. What the heck is the ...
  2. Angles
    Given a line: (x1,y1)-(x2,y2) given a line; (x1,0)-(x2,100) how can i find the angle of these 2 lines?
  3. angle calculator
    I am haveing great difficulty in obtaining the right answer with the following codes. This is supposed to calculate a compound angle in degrees with this formula: Tan (True Angle C) =Tan (Angle B) X Cos (Angle A) The objective can be seen at this web page: http://www.rapidpr...
  4. Angle of 2 points according to right
    Hi, I need a function(VB) or a formula for calculating the angle of 2 points according to right, in 2d. I have a standing position(X, Y) and I have a looking position(X, Y) and I want to get the angle from right to the looking position. Thanks in advance. - Julian
  5. Converting Angle To Coordinates
    Hi, I need a formula, algorithm or a function("Visual Basic") that can take a position(X, Y), an angle(0-360) and a number, and based on these values it will give you a position(X, Y). For example if I say: Position: 1, 1 Angle: 90 Number: 2 it will return 1, 3, ...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: billprewPosted on 2009-09-12 at 18:24:37ID: 25318596

Something like this will get the hour (h) based on the angle samples you gave:

i=truncate(angle/30)
if i>1 then h=14-i else h=2-i

For the minute hand I'd want to see some sample data like you gave for the hour, but it could be similar to the hour and look like:

i=truncate(angle/6)
if i>1 then h=70-i else h=10-i

I don't understand the third part of your question.

Why did you set zero degrees at 2:00 rather that 12:00, seems odd.

~bp

 

by: aburrPosted on 2009-09-12 at 19:24:13ID: 25318728

something seem to be wrong with 11 O'clock

 

by: aburrPosted on 2009-09-12 at 19:27:50ID: 25318742

"What would be the formula to find out which minute the minute hand is pointing to if given the angle of it?"

What does the minute hand make an angle with?
do you start with the angle that the minute hand makes with the vertical? or with the direction from center to 2? Or the angle it makes with the hour hand?

 

by: aburrPosted on 2009-09-12 at 19:48:38ID: 25318774

"What would be the formula to find out which minute the minute hand is pointing to if given the angle of it?"
--
If by angel you mean the counterclockwise angle that the minute hand makes with a vertical the relation is
time (in minutes) = 60 - angle/6

 

by: stormistPosted on 2009-09-12 at 22:41:15ID: 25319086

The hour code worked great. The minute code gave weird results but like you said the zero degrees starting at 2 is odd and makes this more difficult. It comes from the method below. Do you see any way to fix it where 12 would be 0 degrees and then it would continue clockwise to 360?

To clarify on my last question. If a user were to drag the hour hand halfway between the 2 and 3, using angle-to- hour formula we know they want the hour to be 2'Oclock but at that degree (assuming the method below were working correctly and 12'oclock was 0 degrees and moved onward clockwise, say they clicked on 76 degrees when they clicked halfway between 2-3) what degree should the minute hand be set out to properly reflect the time when the hour hand is at that degree. (halfway between 2 and 3)

Thank you very much for your time and replies.

 /// <summary>
        /// gets Angle from mouse position
        /// </summary>
        /// <param name="xy">Mouse Position</param>
        /// <param name="origin">Center of circle</param>
        /// <returns>angle</returns>
        private float XYToDegrees(Point xy, Point origin)
        {
            double angle = 0.0;
 
            if (xy.Y < origin.Y)
            {
                if (xy.X > origin.X)
                {
                    angle = (double)(xy.X - origin.X) / (double)(origin.Y - xy.Y);
                    angle = Math.Atan(angle);
                    angle = 90.0 - angle * 180.0 / Math.PI;
                }
                else if (xy.X < origin.X)
                {
                    angle = (double)(origin.X - xy.X) / (double)(origin.Y - xy.Y);
                    angle = Math.Atan(-angle);
                    angle = 90.0 - angle * 180.0 / Math.PI;
                }
            }
            else if (xy.Y > origin.Y)
            {
                if (xy.X > origin.X)
                {
                    angle = (double)(xy.X - origin.X) / (double)(xy.Y - origin.Y);
                    angle = Math.Atan(-angle);
                    angle = 270.0 - angle * 180.0 / Math.PI;
                }
                else if (xy.X < origin.X)
                {
                    angle = (double)(origin.X - xy.X) / (double)(xy.Y - origin.Y);
                    angle = Math.Atan(angle);
                    angle = 270.0 - angle * 180.0 / Math.PI;
                }
            }
            return (float)angle;
        }

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:

Select allOpen in new window

 

by: thehagmanPosted on 2009-09-13 at 00:20:58ID: 25319291

Well, if billprew's formula

i=truncate(angle/30)
if i>1 then h=14-i else h=2-i

worked for h, then it can be slghtly rewritten as follows:

t = 2.0 - angle/30.0
if t < 1.0 then t = t + 12.0
h = truncate(t)

This should still give the same hour, but we can add a line to calculate the minutes from the rest:

m = truncate(60*(t-h))




 

by: billprewPosted on 2009-09-13 at 07:41:28ID: 25320359

Using a modified version of your procedure shown below, this should return the angle of the mouse position relative to the origin, with 0 degrees at the top (12:00), and 180 degrees at the bottom (6:00).  This makes the calculation of the hours or minutes from degrees simpler as:

h=truncate(angle/30)
if h<1 then h=h+12

m=truncate(angle/6)

I think you also need to add code to you routine to handle the case where X and/or Y equal the origin X or origin Y, since those are special cases and some can cause division by zero.

~bp

/// <summary>
/// gets Angle from mouse position
/// </summary>
/// <param name="xy">Mouse Position</param>
/// <param name="origin">Center of circle</param>
/// <returns>angle</returns>
private float XYToDegrees(Point xy, Point origin)
{
    double angle = 0.0;
    double base = 0.0;
 
    if (xy.Y < origin.Y)
        base = 180.0;
    else if (xy.Y > origin.Y)
        if (xy.X > origin.X)
            base = 0.0;
        else if (xy.X < origin.X)
            base = 360.0;
 
    angle = (double)(xy.X - origin.X) / (double)(xy.Y - origin.Y);
    angle = Math.Atan(-angle);
    angle = (angle + base) * 180.0 / Math.PI;
 
    return (float)angle;
}

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

Select allOpen in new window

 

by: billprewPosted on 2009-09-13 at 07:42:23ID: 25320362

Oops, cut and paste error in the above, correct one line to:

angle = Math.Atan(angle);

~bp

 

by: stormistPosted on 2009-09-13 at 11:37:33ID: 25321269

This method seems to be returning some weird stuff.
I copied it below with the correction you stated plus base renamed to based since base is reserved in C#

10314 at 12
10225 at 3

20625 at 6

20564 at 8

  /// gets Angle from mouse position
        /// </summary>
        /// <param name="xy">Mouse Position</param>
        /// <param name="origin">Center of circle</param>
        /// <returns>angle</returns>
        private float XYToDegrees(Point xy, Point origin)
        {
            double angle = 0.0;
            double based = 0.0;
 
            if (xy.Y < origin.Y)
                based = 180.0;
            else if (xy.Y > origin.Y)
                if (xy.X > origin.X)
                    based = 0.0;
                else if (xy.X < origin.X)
                    based = 360.0;
 
            angle = (double)(xy.X - origin.X) / (double)(xy.Y - origin.Y);
            angle = Math.Atan(angle);
            angle = (angle + based) * 180.0 / Math.PI;
 
            return (float)angle;
        }

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

Select allOpen in new window

 

by: billprewPosted on 2009-09-13 at 12:55:02ID: 25321486

My bad, I had worked it out on paper, then messed it up in updating your code.  Try this change.

angle = (angle * 180.0 / Math.PI) + based;

~bp

 

by: stormistPosted on 2009-09-13 at 13:30:45ID: 25321603

I assumed you mean't to change the last line on angle =. Did so and got 0 degrees at 6'oclock, and incrementation to 360 counterclockwise. If some kind of mirror effect could be applied it would be working correctly I think?

Any idea what the problem could be?

Thanks so much for your continued assistance.

 

by: billprewPosted on 2009-09-13 at 13:55:59ID: 25321688

Well, not sure what is going on here, unless what I'm thinking of on paper isn't matching the coordinates you are using.  I'm attaching an Excel sheet with a number of test cases, and the calculations that should be occurring in your routine now.  The Excel sheet seems to give the results I am expecting.

The first four columns should make sense, they are just the origin X and Y, and the data point X and Y.  Then I calculated the "based" value as you should be.  Then I calculated the angle in radians for these points.  Next I convert to degrees (angle*180/PI).  Lastly I add to the "biased" value.  I am seeing values as I would have expected in the sheet.

~bp

 

by: billprewPosted on 2009-09-13 at 14:16:30ID: 25321756

I created a quick test in Java and the algorithm seems to work, so I must be visualizing things different than you maybe?  Here's the program to test the same data as Excel, and the results after it.

~bp

public class ee {
    public static void main (String[] args) {
        System.out.printf("%f\n", XYToDegrees(0,  0,  1,  1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -1, 1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  1,  -1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -1, -1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  2,  1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -2, 1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  2,  -1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -2, -1));
        System.out.printf("%f\n", XYToDegrees(0,  0,  1,  2));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -1, 2));
        System.out.printf("%f\n", XYToDegrees(0,  0,  1,  -2));
        System.out.printf("%f\n", XYToDegrees(0,  0,  -1, -2));
        System.out.printf("%f\n", XYToDegrees(10, 10, 15, 15));
        System.out.printf("%f\n", XYToDegrees(10, 10, 5,  15));
        System.out.printf("%f\n", XYToDegrees(10, 10, 15, 5));
        System.out.printf("%f\n", XYToDegrees(10, 10, 5,  5));
        System.out.printf("%f\n", XYToDegrees(10, 10, 20, 15));
        System.out.printf("%f\n", XYToDegrees(10, 10, 0,  15));
        System.out.printf("%f\n", XYToDegrees(10, 10, 20, 5));
        System.out.printf("%f\n", XYToDegrees(10, 10, 0,  5));
        System.out.printf("%f\n", XYToDegrees(10, 10, 15, 20));
        System.out.printf("%f\n", XYToDegrees(10, 10, 5,  20));
        System.out.printf("%f\n", XYToDegrees(10, 10, 15, 0));
        System.out.printf("%f\n", XYToDegrees(10, 10, 5,  0));
    }
 
    public static float XYToDegrees(float ox, float oy, float x, float y)
    {
        double angle = 0.0;
        double base = 0.0;
 
        if (y < oy)
            base = 180.0;
        else if (y > oy)
            if (x > ox)
                base = 0.0;
            else if (x < ox)
                base = 360.0;
 
        angle = (double)(x - ox) / (double)(y - oy);
        angle = Math.atan(angle);
        angle = (angle * 180.0 / Math.PI) + base;
 
        return (float)angle;
    }
}
 
 
45.000000
315.000000
135.000000
225.000000
63.434948
296.565063
116.565048
243.434952
26.565052
333.434937
153.434952
206.565048
45.000000
315.000000
135.000000
225.000000
63.434948
296.565063
116.565048
243.434952
26.565052
333.434937
153.434952
206.565048

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:

Select allOpen in new window

 

by: stormistPosted on 2009-09-13 at 14:47:13ID: 25321879

Could it be something to do with the fact that as I go from left to right on my clock face the mouse position returned on the X axis increases (as expected) but when I go up on the Y axis, the Y cordinate decreases. When I go down, the Y Cordinate increases. Shouldn't the Y axis go up and my mouse goes up and vice versa? I'm just using the point returned from my mouse click event..



 

by: stormistPosted on 2009-09-13 at 14:55:30ID: 25321931

From Cordinate system being utilized, here are the values of X/Y at various points  on the clock. (approx)


Clock Angle:

X: 69 Y: 23 Angle 180 12'oclock
X: 112 Y: 66 Angle 93.9 3'oclock
X: 91 Y: 105 Angle 31.4 5'oclock
X: 47 Y: 106 Angle 329.2 7 o clock
X: 27 Y 66 Angle 265 9 'oclock
X: 48 Y: 32 Angle 209 11'oclock


Perhaps that is the discrepancy? Never does the coordinate system used in the control go into the negative.

 

by: billprewPosted on 2009-09-13 at 15:00:32ID: 25321956

Ah yes, that will pose a problem, let me think about how that needs to be addressed.  I should have picked up on that earlier, typical coordinate systems used for the computer screen mouse are based off of 0,0 being in the upper left, and then increasing in positive values from there.

~bp

 

by: billprewPosted on 2009-09-13 at 15:18:52ID: 25322027

Okay, see if this works better.  I also added the logic to handle the 4 multiples of 90.

~bp

/// gets Angle from mouse position
/// </summary>
/// <param name="xy">Mouse Position</param>
/// <param name="origin">Center of circle</param>
/// <returns>angle</returns>
private float XYToDegrees(Point xy, Point origin)
{
    double angle = 0.0;
    double based = 0.0;
 
    if (xy.Y == origin.Y)
        if (xy.X > origin.X)
            angle = 90.0;
        else 
            return 270.0;
 
    if (xy.X == origin.X)
        if (xy.Y > origin.Y)
            angle = 180.0;
        else 
            return 0.0;
 
    if (xy.Y > origin.Y)
        based = 180.0;
    else 
        if (xy.X > origin.X)
            based = 0.0;
        else
            based = 360.0;
 
    angle = (double)(xy.X - origin.X) / (double)(xy.Y - origin.Y);
    angle = Math.Atan(angle);
    angle = based - (angle * 180.0 / Math.PI);
 
    return (float)angle;
}

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

Select allOpen in new window

 

by: billprewPosted on 2009-09-13 at 15:20:01ID: 25322031

Oops, a couple of typos there, should be this.

~bp

/// gets Angle from mouse position
/// </summary>
/// <param name="xy">Mouse Position</param>
/// <param name="origin">Center of circle</param>
/// <returns>angle</returns>
private float XYToDegrees(Point xy, Point origin)
{
    double angle = 0.0;
    double based = 0.0;
 
    if (xy.Y == origin.Y)
        if (xy.X > origin.X)
            return 90.0;
        else 
            return 270.0;
 
    if (xy.X == origin.X)
        if (xy.Y > origin.Y)
            return 180.0;
        else 
            return 0.0;
 
    if (xy.Y > origin.Y)
        based = 180.0;
    else 
        if (xy.X > origin.X)
            based = 0.0;
        else
            based = 360.0;
 
    angle = (double)(xy.X - origin.X) / (double)(xy.Y - origin.Y);
    angle = Math.Atan(angle);
    angle = based - (angle * 180.0 / Math.PI);
 
    return (float)angle;
}

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

Select allOpen in new window

 

by: stormistPosted on 2009-09-13 at 15:40:41ID: 25322131

Brilliant! Works great!!  Was beginning to think I was seeing numbers backwards or something =)

Thanks a ton! Here is a follow-up question I just posted:
http://www.experts-exchange.com/Programming/Algorithms/Q_24728287.html

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...